自考JAVA语言程序设计一课后习题答案和源代码第四章.docx
《自考JAVA语言程序设计一课后习题答案和源代码第四章.docx》由会员分享,可在线阅读,更多相关《自考JAVA语言程序设计一课后习题答案和源代码第四章.docx(24页珍藏版)》请在冰豆网上搜索。
自考JAVA语言程序设计一课后习题答案和源代码第四章
第四章
4.9声明MyDate类,功能:
增加1天,增减1月和增加1年的方法;输出MyDate对象日期的方法;求两个MyDate对象日期差的方法。
并提供能用当前日期初始化MyDate类对象的构造方法。
程序运行结果:
源文件:
MyDate.java
importjava.util.Calendar;
/**
*日历类
*@author黎明你好
*/
publicclassMyDate
{
publicstaticlongYEAR_MSEL=1000*60*60*24*365L;
publicstaticlongMONTH_MSEL=1000*60*60*24*30L;
publicstaticlongDATE_MSEL=1000*60*60*24L;
publicstaticlongHOUR_MSEL=1000*60*60L;
publicstaticlongMINUTE_MSEL=1000*60L;
privateintyear;
privateintmonth;
privateintdate;
privateinthour;
privateintminute;
privateintsecond;
privateCalendarcalendar;
/**
*构造方法使用当前时间日期初始化对象
*/
publicMyDate()
{
calendar=Calendar.getInstance();
year=calendar.get(Calendar.YEAR);
month=calendar.get(Calendar.MONTH)+1;
date=calendar.get(Calendar.DAY_OF_MONTH);
hour=calendar.get(Calendar.HOUR_OF_DAY);
minute=calendar.get(Calendar.MINUTE);
second=calendar.get(Calendar.SECOND);
}
/**
*构造方法使用指定年、月、日初始化对象
*/
publicMyDate(intyear,intmonth,intdate)
{
set(year,month,date);
}
/**
*构造方法使用指定年、月、日、时、分、秒初始化对象
*/
publicMyDate(intyear,intmonth,intdate,inthourOfDay,intminute,intsecond)
{
set(year,month,date,hourOfDay,minute,second);
}
/**
*设置日历字段year、month和date的值。
*@paramyear-用来设置YEAR日历字段的值。
*@parammonth-用来设置month日历字段的值。
*@paramdate-用来设置date日历字段的值。
*/
publicvoidset(intyear,intmonth,intdate)
{
set(year,month,date,0,0,0);
}
/**
*设置日历字段year、month和date的值。
*@paramyear-用来设置YEAR日历字段的值。
*@parammonth-用来设置month日历字段的值。
*@paramdate-用来设置date日历字段的值。
*@paramhourOfDay-用来设置hour日历字段的值。
*@paramminute-用来设置minute日历字段的值。
*@paramsecond-用来设置second日历字段的值。
*/
publicvoidset(intyear,intmonth,intdate,inthourOfDay,intminute,intsecond)
{
calendar=Calendar.getInstance();
calendar.set(year,month-1,date,hourOfDay,minute,second);
this.year=calendar.get(Calendar.YEAR);;
this.month=calendar.get(Calendar.MONTH)+1;
this.date=calendar.get(Calendar.DAY_OF_MONTH);
this.hour=calendar.get(Calendar.HOUR_OF_DAY);
this.minute=calendar.get(Calendar.MINUTE);
this.second=calendar.get(Calendar.SECOND);
}
/**
*增加一天
*/
publicvoidaddOneDay()
{
date++;
calendar.set(year,month,date);
}
/**
*增减一月
*/
publicvoidaddOneMonth()
{
month++;
calendar.set(year,month,date);
}
/**
*增加一年
*/
publicvoidaddOneYear()
{
year++;
calendar.set(year,month,date);
}
/**
*返回此时间值,以毫秒为单位。
*@return-当前时间,以从历元至现在所经过的UTC毫秒数形式。
*/
publiclonggetTimeInMillis()
{
returncalendar.getTimeInMillis();
}
/**
*两个日期相差的时间
*@parammd-另一个日期对象
*@return-相差的时间
*/
publicStringapart(MyDatemd)
{
longmsel=this.getTimeInMillis()-md.getTimeInMillis();
msel=Math.abs(msel);
booleanboo=msel>0?
true:
false;
longyear=msel/MyDate.YEAR_MSEL;
longdate=msel%MyDate.YEAR_MSEL/MyDate.DATE_MSEL;
longhour=msel%MyDate.DATE_MSEL/MyDate.HOUR_MSEL;
longminute=msel%MyDate.HOUR_MSEL/MyDate.MINUTE_MSEL;
longsecond=msel%MyDate.MINUTE_MSEL/1000;
Stringresult="";
if(boo)
result="已过去";
else
result="还有";
result+=(year+"年"+date+"天"+hour+"小时"+minute+"分钟"+second+"秒");
returnresult;
}
/**
*返回此日历的字符串表示形式。
*@return-此日历的字符串表示形式。
*/
publicStringtoString()
{
returnyear+"年"+month+"月"+date+"日,"+hour+":
"+minute+":
"+second;
}
}
测试类源文件:
TestMyDate.java
/**
*MyDate的测试类
*@author黎明你好
*/
publicclassTestMyDate
{
publicstaticvoidmain(String[]args)
{
MyDatemd1=newMyDate();
MyDatemd2=newMyDate(2010,2,13);
MyDatemd3=newMyDate(2008,8,8,20,0,0);
System.out.println("当前时间:
"+md1.toString());
System.out.println("2010年除夕:
"+md2.toString());
md2.addOneDay();
System.out.println("增加一天后,大年初一:
"+md2.toString());
System.out.println("现在距新年:
"+md1.apart(md2));
System.out.println("现在距08年北京奥运会:
"+md1.apart(md3));
}
}
4.10求前n个质数。
要求确定m是否是质数,用早先求出的质数对m的整除性来确定。
/**
*求前n个质数。
*确定m是否是质数,用早先求出的质数对m的整除性来确定。
*@author黎明你好
*/
publicclassWork4_10
{
/**用来存质数的数组*/
privateintarrayInt[];
publicWork4_10(intn)
{
arrayInt=newint[n];
arrayInt[0]=2;
intindex=1;//保存数组的有效长度
booleanboo=true;
for(inti=2;i{
boo=true;
for(intj=0;j{
if(i%arrayInt[j]==0)//用已存入数组中的质数判断
boo=false;
}
if(boo)//如果是true则是指数,存入数组,数组有效长度加1.
{
arrayInt[index]=i;
index++;
}
}
}
/**
*打印数组元素
*/
publicStringprintArray()
{
Stringresult="";
for(inti=0;i{
if(arrayInt[i]!
=0)
result+=arrayInt[i]+"";
}
returnresult;
}
publicstaticvoidmain(String[]args)
{
Work4_10w=newWork4_10(100);
System.out.println(w.printArray());
}
}
4.11编写实现从两个字符串中找出最长的相同字符列的代码。
程序运行结果:
/**
*找出两个字符串中,最长的相同字符列
*@author黎明你好
*/
publicclassWork4_11
{
publicstaticvoidmain(String[]args)
{
Stringstr1="0000abcdef0000";
Stringstr2="123ab4567cdef789abcdef";
Stringstr3=getLongSameString(str1,str2);
System.out.println("str1="+str1);
System.out.println("str2="+str2);
System.out.println("最长的相同字符串为:
"+str3);
}
publicstaticStringgetLongSameString(Stringstr1,Stringstr2)
{
Stringtemp="";
Stringsame="";
StringlongSame="";
for(inti=0;i{
for(intj=i+1;j<=str1.length();j++)
{
temp=str1.substring(i,j);
if(str2.indexOf(temp)>0)
{
same=temp;
if(longSame.length(){
longSame=temp;
}
}
}
}
returnlongSame;
}
}
4.12整理字符串,将字符串的前导空白符和后随空白符删去,并将字符串中非空白字符之间的连接的多个空白符只保留一个,而去掉多余的空白符。
程序运行结果:
publicclassWork4_12
{
publicstaticvoidmain(String[]args)
{
Stringstr="ILoveYou";
System.out.println("str="+str);
System.out.println("变换后:
"+deleteBlank(str));
}
publicstaticStringdeleteBlank(Stringstr)
{
chararray[]=str.trim().toCharArray();
Stringresult="";
for(inti=0;i{
if(!
(array[i]==''&&array[i+1]==''))
result+=array[i];
}
returnresult;
}
}
4.13编写用数组实现大整数的类,提供大整数的加、减、乘等运算。
程序运行结果:
大整数类源文件:
MyBigInteger.java
/**
*大整数类
*@author黎明你好
*/
publicclassMyBigInteger
{
/**能存储的最大位数*/
publicstaticfinalintMAXLENGTH=100;
/**正负号标识*/
privateintsignum=1;
/**实际存储用的数组*/
privateintdataArray[];
/**
*将参数的十进制字符串表示形式转换为BigInteger。
*@paramval-要转换的十进制字符串表示形式。
*/
publicMyBigInteger(Stringval)
{
this.setData(val);
}
/**
*声明一个MAXLENGTH位的,空的大整数类
*/
publicMyBigInteger()
{
dataArray=newint[MyBigInteger.MAXLENGTH];
}
/**
*根据十进制字符串表示形式转换为MyBigInteger的数据
*@paramstr-十进制字符串表示形式。
*/
publicvoidsetData(Stringstr)
{
dataArray=newint[MyBigInteger.MAXLENGTH];
try
{
intend=0;
signum=1;
if(str.charAt(0)=='-')
{
signum=-1;
end=1;
}
intindex=0;
for(inti=str.length()-1;i>=end;i--)
{
dataArray[index++]=Integer.parseInt(String.valueOf(str.charAt(i)));
}
}
catch(NumberFormatExceptione)
{
e.printStackTrace();
}
}
/**
*加法,返回其值为(this+val)的BigInteger。
*@paramval-将添加到此BigInteger中的值。
*@return-this+val
*/
publicMyBigIntegeradd(MyBigIntegerval)
{
MyBigIntegerresult=newMyBigInteger();
if(this.signum>0&&val.signum<0)//正+负:
转化成(正-正)的减法,进行计算
{
returnthis.subtract(val.abs());
}
elseif(this.signum<0&&val.signum>0)//负+正:
转换成(负-负)的减法,进行计算
{
MyBigIntegertemp=val.abs();
temp.signum=-1;
returnthis.subtract(temp);
}
elseif(this.signum>0&&val.signum>0)//正+正:
直接相加,结果为正
result.signum=1;
elseif(this.signum<0&&val.signum<0)//负+负:
直接相加,结果为负
result.signum=-1;
intmaxlength=Math.max(this.length(),val.length());
for(inti=0;i{
result.dataArray[i]+=this.dataArray[i]+val.dataArray[i];
result.carryBit(i);
}
returnresult;
}
/**
*减法,返回其值为(this-val)的BigInteger。
*@paramval-从此BigInteger中减去的值。
*@return-this-val
*/
publicMyBigIntegersubtract(MyBigIntegerval)
{
MyBigIntegerresult=newMyBigInteger();
//正-负:
转化成(正+正)的加法,进行计算
if(this.signum>0&&val.signum<0)
{
result=this.add(val.abs());
}
//负-正:
转换成(负+负)的加法,进行计算
elseif(this.signum<0&&val.signum>0)
{
MyBigIntegertemp=val.abs();//注意这里,如果直接改变val,会会改观引用原先的对象的属性
temp.signum=-1;
result=this.add(temp);
}
//负-负:
转换成正-正,调换位置
elseif(this.signum<0&&val.signum<0)
{
result=val.abs().subtract(this.abs());
}
//正-正,用大的减小的,符号取决于绝对值大的
elseif(this.signum>0&&val.signum>0)
{
MyBigIntegermax,min;
intsign=pareTo(val);
if(sign==0)//如果相等
returnnewMyBigInteger("0");
elseif(sign>0)
{
max=this;
min=val;
result.signum=1;
}
else
{
max=val;
min=this;
result.signum=-1;
}
for(inti=0;i{
result.dataArray[i]+=max.dataArray[i]-min.dataArray[i];
result.borrowBit(i);
}
}
returnresult;
}
/**
*乘法,返回其值为(this*val)的BigInteger。
*@paramval-要乘以此BigInteger的值。
*@return-this*val
*/
publicMyBigIntegermultiply(MyBigIntegerval)
{
MyBigIntegerresult=newMyBigInteger();
result.signum=this.signum*val.signum;