又开始看《编程珠玑》,发现之前看的也许不是很认真吧,再看一遍的时候竟没有什么似曾相识的感觉。于是便开始做后面的习题了,也许这样能让我对这一章的内容印象更深刻些。
第三章介绍了几个案例,说明了数据的组织是如何影响程序的结构的,说到底,就是要设计好的数据结构,以减少编程的量。这一章的内容相对简单,我做了后面两道题:3.7的第1题和第4题,贴在这里了:
第一题:
double getTax( int income ){
//用这两个数组来代替程序员的25条if语句
int base[25] = { 0, 2200, 2700, 3200, 3700, ..., 102200};
double rate[25] = { 0, 0.14, 0.15, 0.16,0.17, ..., 0.7} ;
int init = 24;
while( income<base[init] && init>=0 )
init --;
double tax = 0;
tax += (income-base[init])*rate[init];
while( init>0 ){
tax += (base[init]-base[init-1])*rate[init-1];
init --;
}
return tax;
}
第四题:
#include<iostream>
using namespace std;
class MyDate{
public:
int day;
int month;
int year;
MyDate( int yy, int mm, int dd ){
day = dd;
month = mm;
year = yy;
if( !check() ){
cerr<<"invalid date!"<<endl;
}
}
//检查日期是否合理
bool check(){
if( year<0 || month<=0 || month>12 || day<1 )
return false;
if( month == 2 && isLeap(year) )
return day<=29;
else
return day <= daysOfMonths[month];
}
//计算两个日期之间的天数时,首先找出较小的那个,before( another )返回this指向的日期是否比another早
bool before( MyDate another ){
return (another.year>year) || (another.year==year && another.month>month )
|| (another.year==year&&another.month==month&&another.day>day) ;
}
//特定年份是否为闰年
bool isLeap( int year ){
return ( year%400==0 || (year%100!=0 && year%4==0 ) );
}
//计算该日期距离年份yy的第一天有多少天
int daysFromYear( int yy ){
int days = 0;
if( year < yy )
return -1;
while( year>yy ){
days += (isLeap(yy)?366:365);
yy ++ ;
}
int mm = 1;
while( mm<month ){
days += daysOfMonths[mm];
mm ++;
}
if( month>2 && isLeap(year) )
days ++;
days += day;
return days;
}
//这里就是计算this的日期与another的日期之间有多少天,
//它们共同以最早的那个年份为基础,计算距离那天过了多少天
//然后算出差距即是两个日期之间的差距
int getDaysCount( MyDate another ){
if( before( another ) )
return (another.daysFromYear(year) - daysFromYear(year));
else
return (daysFromYear(another.year) - another.daysFromYear(another.year));
}
//计算this日期是星期几
int getWeekDay(){
int count = getDaysCount( ReferDay );
if( before( ReferDay ) )
return ((RefWeekDay + 7 - count%7 )%7 );
else
return (RefWeekDay+count%7)%7;
}
//打印出this日期所在月份的日历
void printMonth(){
cout<<"\n\n";
cout<<"Month "<<month<<" Year "<<year<<endl;
int dayOfMonth = daysOfMonths[month];
if( month == 2 && isLeap(year) )
dayOfMonth++;
MyDate firstDay = MyDate( year, month, 1 );
int firstWeekDay = firstDay.getWeekDay();
int weekDay = firstWeekDay;
for( int i=0; i<weekDay; i++ )
cout<<"\t_______";
for( int i=1; i<10; i++ ){
cout<<"\t0"<<i<<"{"<<Str_Date[weekDay]<<"}";
if( weekDay == 6 )
cout<<"\n";
weekDay = (weekDay+1)%7;
}
for( int i=10; i<=dayOfMonth; i++ ){
cout<<"\t"<<i<<"{"<<Str_Date[weekDay]<<"}";
if( weekDay == 6 )
cout<<"\n";
weekDay = (weekDay+1)%7;
}
}
private:
static const int MONTHS_OF_YEAR = 12;
static const int DAYS_OF_WEEK = 7;
static int daysOfMonths[MONTHS_OF_YEAR+1];
static string Str_Date[DAYS_OF_WEEK];
static MyDate ReferDay;
static int RefWeekDay;
};
int MyDate::daysOfMonths[MyDate::MONTHS_OF_YEAR+1] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
string MyDate::Str_Date[MyDate::DAYS_OF_WEEK] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
MyDate MyDate::ReferDay = MyDate( 2011, 12, 21 );
int MyDate::RefWeekDay = 3;
算法上来说自然是没有什么难度的,不过就是尽量写得简洁吧。
很惭愧的,看了《C++ primer》之后就又开始用java编程了,结果又回来写C++的时候就又把它们的语法混在一起了,通过第四题的编程,记住了下面两点:
(1)this是一个指针,所以如果要在函数体内显式使用this的话,用的是->操作符,而不是.操作符。我把它跟java混在一起了,然后用this.year,一直编译出错。
(2)对象的static成员在对象的定义体内声明,但必须在定义体外定义。一开始我在对象定义体内就给它赋初值,结果总是编译出错。
分享到:
相关推荐
编程珠玑 很好的资料 能加强对对算法和数据结构的理解
一本国外经典的国外数据结构算法书籍,值得大家看一看,PDF格式。
关于算法的,C语言,计算时间复杂度空间复杂度分析很详细,一些改进算法
14.1 数据结构 141 14.2 两个关键函数 143 14.3 优先级队列 145 14.4 一种排序算法 148 14.5 原理 150 14.6 习题 150 14.7 深入阅读 152 第15章 字符串 153 15.1 单词 153 15.2 短语 156 15.3 生成文本 ...
《编程珠玑》第一版是我早期职业生涯中阅读过的对我影响较大的书籍之一,在书中首次接触到的很多观点都让我长期受益。作者在这一版本中做了重要更新。新增加的很多例子让我耳目一新。 ——Steve McConnell,...
编程珠玑 第2版(修订版),从网上花钱买的,人民邮电版本,是所有版本里面翻译最好的,非常清晰
编程珠玑(第二版)中文版.pdf 学编程的都可以看看,老少皆宜a !! 编程 数据结构 算法 性能 效率
主要内容包括 堆 栈 排序 性能 应用 代码调优 数据结构 高性能搜索 排序算法。循序渐进,由浅入深的讲述编写程序过程中性能的优化
算法,第3章 数据决定程序结构,第4章 编写正确的程序,第5章 编程小事,第6章 程序性能分析,第7章 粗略估算,第8章 算法设计技术,第9章 代码调优,第10章 节省空间,第11章 排序,第12章 取样问题,第...
本书内容包括问题定义、算法、数据结构、程序验证与测试、程序优化与效率问题,以及这些技巧在排序、查找和字符串处理等方面的几个实际应用。 本书每章末尾都附带有相关内容的问题,附录中给出了一些问题的提示和...
编程珠玑(第二版).pdf 数据结构常用算法集.chm 算法导论.pdf
老外写的数据结构与算法方面的经典书籍,当年是可是排行榜的红人。推荐大家学习和下载!
leetcode中国 algo Data ...《编程之美》、《剑指offer》、《编程珠玑》 3:编程语言 《数据结构与算法分析:Java语言描述》 4:闲暇阅读 《算法帝国》、《数学之美》、《算法之美》 5:经典大部头
位图数据结构: 最开始了解这个结构,是在刷leetcode的时候,宛如杂技般的编程,时间与空间的双赢。 减少程序空间需求,往往也会减少其运行时间。 设计标准 设计者确定其设计已经达到了完美的标准不是不能再增加任何...
数据结构与算法之美 基础篇 go k8s实战 go MySQL系列 React 系列 深入浅出redis go—interview 最近在读编程珠玑 最近在读编程珠玑,打算每天做一些题目放上来,持续更新 go-高级编程 go-设计模式 深入理解计算机...
JON BENTLEY的《编程珠玑》是程序员们最喜欢的书籍,可位于经典之列。如同珍珠来自于曾经折磨牡蛎的沙粒,程序设计的珍珠也来自曾经折磨程序员的实际问题。BENTLEY的珍珠建立在坚实的工程学基础上,在洞察力和创造力...
典型相关分析matlab实现代码 - java/c/c++/人工智能/机器学习/深度学习/前端/数据库/mysql...编程珠玑 密码:7777 啊哈算法 密码:7777 程序员的算法趣题 密码:7777 c++与数据结构 密码:7777 算法之道 密码:7777 算法图解