您的位置:首页 > 编程语言

编程珠玑第三章3.7习题(1-4)

2016-08-24 22:23 393 查看
1.收税问题。

关注收税区间段的起始部分,结束部分,及此区间的税率;因为收税区间段都是每500$一个间隔且税率也随着收税区间的提高每次加上0.01;因而很容易得到下面的循环累加程序。

package chapter3;

public class t1 {
public static float getTax(int income){
float taxRate=0.14f;
float tax=0;
int cur_taxed_range_start=2200;//表示当前收税的区间段的开始部分
while(income>cur_taxed_range_start){
if(income>cur_taxed_range_start+500){
tax+=500*taxRate;
taxRate+=0.01;
cur_taxed_range_start+=500;
}
else{
tax+=(income-cur_taxed_range_start)*taxRate;
break;//跳出循环,不可能再到下一个收税区间了
}
}
return tax;

}
public static void main(String args[]){
System.out.println(getTax(3400));
System.out.println(getTax(4000));
}

}


2.k阶常系数线性递归函数定义的级数问题

An=C1*An-1+C2*An-2+……+CkAn-k+Ck+1;

其中,C1,C2,….,Ck+1为实数,编写一个程序,其输入为k,A1,…,Ak,C1,…,Ck+1和m,至少输出为A1至Am

代码如下

package chapter3;

public class t2 {
public  static int computeAn(int a[],int n,int c[]){
for(int i=1;i<c.length-1;i++){
a
+=c[i]*a[n-i];
}
a
+=c[c.length-1];
return a
;
}
public static void main(String [] args){
int k=Integer.valueOf(args[0]);
int m=Integer.valueOf(args[2*k+2]);
int a[]=new int[m+1];
for(int i=1;i<=k;i++){
a[i]=Integer.valueOf(args[i]);
}
int c[]=new int[k+2];
for(int i=1;i<k+2;i++){
c[i]=Integer.valueOf(args[k+i]);
}

if(m>k){
for(int i=k+1;i<=m;i++){
computeAn(a, i, c);
}
}
for(int i=1;i<=m;i++){
System.out.print(a[i]+" ");
}
}
}


运行前进行配置,我实在myeclipse(eclipse类似),右击在run as 选择run configuration,进行如下配置


所以我的配置中设置k=4;a1,a2,a3,a4分别是1,2,3,4;c1到c5全为1;m=8;



3.可以当个游戏写写看,只要将26个字母分别图形化表示即可。对于每个字母控制输出的空格及及用于表示字母的基本符号的个数,还有行数等等

4.编写处理如下日期问题的函数:给定两个日期,计算两者之间的天数;给定一个日期,返回值为周几;给定月和年,使用字符数组输出该月的日历

这里偷了点懒,用了Date的getTime函数,其实完全可以自己写的,但是有轮子不必自己造,Java甚至还有Calendar类,但是我发现使用有点问题就自己写了。

package chapter3;

import java.util.Date;
public class t3 {
public static boolean judgeYear(int year){//如果是闰年返回true
if(( year%100!=0 && year%4==0 )||(year%400==0)){
return true;
}
return false;
}
public  static int getMonthDays(int month){
switch (month) {
case 2:
return 28;
case 4:
case 6:
case 9:
case 11:
return 30;
default:
return 31;
}
}
public static void main(String [] args){
Date date1=new Date(2016,8,21);//假定知道2016年8月21日为星期日
Date date2=new Date(2016,8,1);
long d1=date1.getTime();
long d2=date2.getTime();
long days;
long oneDayMil=1000*3600*24;
if(d1>d2)
days=(d1-d2)/oneDayMil;
else {
days=(d2-d1)/oneDayMil;
}
System.out.println(days);
int rest=(int) (days%7);
String[] weeks={"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};
if(d1-d2>oneDayMil){
rest=(7-rest)%7;//日期date2如果是前面的话,就需要倒着数,因此用7减一下,又怕刚好是前面的相差的七天整数倍,导致rest=0,从而数组下标溢出,所以对7取模
}
int year=date2.getYear();
int month=date2.getMonth();
int ds;
System.out.println(year+"-"+month+"-"+date2.getDate()+"是"+weeks[rest]);
if(month==2){
if(judgeYear(year)){
ds=29;
}
else {
ds=28;
}
}
else{
ds=getMonthDays(month);
}
System.out.println(year+"年"+month+"月");
System.out.println(" 07  01  02  03  04  05  06");
for(int i=0;i<rest*4;i++){
System.out.print(" ");
}
int count=rest;
for(int i=1;i<=ds;i++)
{   if(i<10)
System.out.print(" 0"+i+" ");
else {
System.out.print(" "+i+" ");
}
count++;
if(count==7){
System.out.println();
count=0;
}
}
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: