当前位置:软件学习 > 其它软件 >>

【编程珠玑】第三章:数据决定程序结构

一,内容
通过使用恰当的数据结构来替代复杂的代码。
二,习题
1、题目描述:本书出版之时,美国的个人收入所得税分为5种不同的税率,其中最大的税率大约为40%.以前的情况则更为复杂,税率也更高。下面所示的程序文本采用25个if语句的合理方法来计算1978年的美国联邦所得税。税率序列为0.14, 0.15, 0.16, 0.17, 0.18.....。序列中此后的计算大于0.01.有何建议呢?
if income <= 2200
tax = 0;
else if income <= 2700
tax = 0.14 * (income - 2200);
else if income <= 3200
tax = 70 + 0.15 * (income - 2700);
else if income <= 3700
tax = 145 + 0.16 * (income -3200);
else if income <= 4200
tax =225 + 0.17 * (income - 3700);
.......
else
tax =53090 + 0.70 * (income - 102200);
采用二分搜索定位到采用哪个分段函数,然后对应求出结果。
源码:
[html]#include <iostream> 
using namespace std; 
 
int basetax[100]; 
int lowerbound[100]; 
double taxrate[100]; 
 
int search(int lowerbound[],int income) 

    int i=0; 
    int j=99; 
    int t=(i+j)/2; 
     
    while(1) 
    { 
         
        if(income - lowerbound[t] < 50 && income - lowerbound[t] >=0) 
            return t; 
        else if(income - lowerbound[t] < 0) //在左侧寻找  
            { 
                j=t; 
                t=(i+j)/2; 
                 
            } 
        else 
            { 
                i=t; 
                t=(i+j)/2; 
            }            
    }    
    return  -1; 
     

int main() 

    basetax[0]=0; 
    lowerbound[0]=0; 
    taxrate[0]=0; 
     
    basetax[1]=0; 
    lowerbound[1]=2200; 
    taxrate[1]=0.14; 
     
    for(int i=2;i<100;++i) 
    { 
        basetax[i]=75*i-80; 
        lowerbound[i]=2200 + (i-1)*500; 
        taxrate[i]=(double)(14 + i-1)/100; 
     
    }    
     
    if(search(lowerbound,salary)) 
    { 
        int salary=2202; 
        int j=search(lowerbound,salary); 
 
        double tax= basetax[j] +   (double)taxrate[j]*(salary -lowerbound[j]); 
     
        cout<<tax<<endl; 
    } 
     
    return 0; 

2、
[cpp]
#include <iostream> 
using namespace std; 
 
int main() 

    int t=0; 
    int i,k; 
    int  n=10; 
    int c[10]={1,2,3,4,5,6,7,8,9,10}; 
    int a[10]={0}; 
    for(k=1;k<n;++k) 
    { 
        for(i=1;i<k;++i) 
            a[k] = a[k-i] * c [i]; 
 
        a[k] +=c[k+1]; 
    } 
    for(i=0;i<n;++i) 
        cout<<a[i]<<endl; 
     
    return 0; 

3、当要输入的数据很多,且没有规律时,可以考虑编写一个格式信函发生器(form letter generator)用于解析格式信函模板(form letter schema)。将数据从控制层分离的好处在于:避免每次针对不同的数据编写不同的代码;当需要改变一些公用文本的输出方式时,直接编辑模板即可,并不需要对数据进行修改。
题目要求:输入一个字母,输出一个字符数组,该数组要以图像的方式将该字母的大写打印出来。
对于26个字母,每个字母的外形并没有必然规律可循,最直接的方法是编写26个函数,针对特定的字母编写特定的打印程序,这是个体力活,代码数量将非常巨大。联想上面的格式信函编程,可以考虑为字母的外形设计一个定制模板,自己规定一套模板编写的格式,然后写一个解析程序,每次打印字母时,只需解析字母对应的模板即可,这样主要的工作量就花在每个字母模板的编写上,当然模板的编写是相当简单的,将字母图形转化为相应的模板格式即可。例如: 一个字母可以利用length = 12, width = 9的矩阵来表示


x  x  x  x  x  x  x  x  x
x  x  x  x  x  x  x  x  x
x  x  x  x  x  x  x  x  x
         x  x  x        
         x  x  x        
         x  x  x        
         x  x  x        
         x  x  x        
         x  x  x        
x  x  x  x  x  x  x  x  x
x  x  x  x  x  x  x  x  x
x  x  x  x  x  x  x  x  x
任何字母都可以在这张表示出来,每个点就像一个像素点。下面就对字母I和L进行模板编码,编码要求
(1)用尽可能简单的方式表示上面的图像;
(2)方便程序解析;
(3)必须适用于所有的情况
根据书上给出的编码结构,上图可表示为:
39x
63b3x3b
39x
编码规则: 第一列表示要打印的行数,,后面的数字代表每行要打印的字符个数,个数后面紧跟要打印的字符,并用空格隔开。这里字母b表示空格。根据上述规则,字母L编码如下:
93x6b
39x
x  x  x                 
x  x  x                 
x  x  x      &n

补充:软件开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,