`
evasiu
  • 浏览: 169530 次
  • 性别: Icon_minigender_2
  • 来自: 广州
博客专栏
Fa47b089-e026-399c-b770-017349f619d5
TCP/IP详解卷一>阅读...
浏览量:12553
社区版块
存档分类
最新评论

编程珠玑 -- 数据结构?

 
阅读更多

又开始看《编程珠玑》,发现之前看的也许不是很认真吧,再看一遍的时候竟没有什么似曾相识的感觉。于是便开始做后面的习题了,也许这样能让我对这一章的内容印象更深刻些。

第三章介绍了几个案例,说明了数据的组织是如何影响程序的结构的,说到底,就是要设计好的数据结构,以减少编程的量。这一章的内容相对简单,我做了后面两道题: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成员在对象的定义体内声明,但必须在定义体外定义。一开始我在对象定义体内就给它赋初值,结果总是编译出错。

分享到:
评论

相关推荐

    编程珠玑-中文第二版

    ### 编程珠玑-中文第二版 #### 知识点概述 《编程珠玑-中文第二版》是一本在计算机科学领域内享有极高声誉的经典著作。本书虽然篇幅不长,但却以其深刻的见解和丰富的内涵深受广大程序员和技术爱好者的推崇。通过...

    编程珠玑 算法 数据结构

    ### 编程珠玑:算法与数据结构精要 #### 核心概念解析 在《编程珠玑》这本书中,作者深入浅出地探讨了算法和数据结构的重要性及其实际应用。该书被认为是学习计算机科学基础知识不可或缺的经典之作。下面将根据...

    asp.net 2.0编程珠玑--来自mvp的权威开发指南

    《ASP.NET 2.0编程珠玑--来自MVP的权威开发指南》是一本深入探讨ASP.NET 2.0技术的专业书籍,由该领域的专家,即微软最有价值专家(MVP)撰写。这本书旨在帮助开发者充分理解和掌握ASP.NET 2.0的核心概念,提升其在...

    编程珠玑-英文版+中文版+source code

    《编程珠玑》之所以成为许多程序员的案头书,不仅因为它涵盖了编程中的许多重要主题,如算法设计、数据结构、性能优化以及编程实践,更重要的是,它教会我们一种解决问题的思维。Jon Bentley的每一篇“珍珠”,都像...

    ASP.NET+2.0编程珠玑--开发指南

    本书“ASP.NET+2.0编程珠玑--开发指南”是针对这个版本的专业指南,由MVP(Microsoft最有价值专家)撰写,旨在帮助开发者深入理解和掌握ASP.NET 2.0的核心概念和技术。 书中可能涵盖了以下关键知识点: 1. **ASP...

    编程珠玑~~~~~~一本经典的数据结构和算法书籍

    ### 编程珠玑——经典的数据结构与算法书籍解析 #### 一、书籍概述 《编程珠玑》是一本在国际上享有盛誉的经典计算机科学著作,它深入浅出地介绍了数据结构与算法的核心概念和技术。这本书对于学习计算机科学基础...

    ASP.NET 2.0编程珠玑--来自MVP的权威开发指南

    这本书《ASP.NET 2.0编程珠玑--来自MVP的权威开发指南》深入探讨了这个平台的核心特性,并提供了实用的开发技巧。 1. **控件体系**:ASP.NET 2.0引入了一套全新的服务器控件,如GridView、DetailsView、FormView等...

    编程珠玑 编程珠玑 编程珠玑 编程

    编程珠玑的核心概念之一是数据结构与算法的选择和设计。书中的例子多以实际问题为背景,通过分析和比较不同的解决方案,展示了如何在特定情境下选择最合适的算法和数据结构。例如,如何有效地搜索和排序数据,以及...

    编程珠玑(第二版)答案

    根据提供的标题“编程珠玑(第二版)答案”和描述“编程珠玑(第二版)答案”,我们可以推测出这是关于《编程珠玑》这本书的相关解答资料。《编程珠玑》是一本经典的计算机科学书籍,作者为Jon Bentley。本书旨在...

    编程珠玑源码下载编程珠玑书后源代码

    《编程珠玑》是计算机科学领域的一本经典之作,由Jon Bentley 编著,它以其深入浅出的方式探讨了程序设计的问题和解决方案,尤其在数据结构、算法优化以及问题解决策略方面有着独到的见解。这本书的源代码是作者为了...

    编程珠玑 第2版(修订版)_编程珠玑修订_资料_

    《编程珠玑》一书将这些技巧和经验整理成章,涵盖了算法、数据结构、性能优化、代码质量等多个方面,是程序员自我提升的重要参考资料。书中强调的问题求解策略和程序设计思想,对于初学者和资深开发者都有很大的启发...

    编程珠玑 编程珠玑续

    《编程珠玑》和其续篇是两部深受程序员喜爱的经典著作,主要涵盖了程序设计、算法分析和数据结构等核心编程领域。这两本书以其深入浅出的讲解方式和丰富的实例,帮助读者提升编程技巧和解决问题的能力。 在《编程...

    编程珠玑高清pdf版.pdf

    总的来说,《编程珠玑》这本书涵盖了编程实践中遇到的诸多问题,包括但不限于数据结构、算法、输入/输出优化等,通过实例解析,使读者能够掌握如何优雅地解决编程挑战。配合压缩包中的其他资源,读者不仅可以深入...

    编程珠玑 Programming Pearls 第二版(中文版+源代码)

    《编程珠玑》是计算机科学领域的一本经典之作,作者是Jon Bentley,它以其独特的视角和深入浅出的讲解方式,向读者展示了编程艺术的精髓。这本书的第二版更是深受程序员和计算机科学家们的喜爱,因为它不仅涵盖了...

    编程珠玑(中文版).pdf

    ### 编程珠玑(中文版).pdf #### 知识点概览 《编程珠玑(中文版)》是一本经典的计算机科学著作,它作为《编程珠玑》系列的一部分,深入探讨了一系列对程序员非常重要的主题。这些知识点涵盖了算法、数据结构、...

    编程珠玑(PDF带目录)

    《编程珠玑》无疑是计算机编程领域中的一块瑰宝,其作者Jon Bentley在编写时便意在创建一本能够经受时间考验的经典著作。本书以其深入浅出的讲解方式和丰富的实例,不仅为读者提供了算法领域的知识,更提供了深入...

    编程珠玑源代码

    《编程珠玑源代码》是针对经典书籍《编程珠玑》第二版的源代码集合,主要涵盖C语言和C++编程。这本书以其独特的视角和深入浅出的讲解方式,深受程序员喜爱,尤其对于数据结构、算法和程序设计思维的提升有着重要的...

    编程珠玑(经典)

    在数据结构方面,《编程珠玑》讨论了数组、链表、树等基本数据结构,以及如何根据具体问题选择合适的数据结构。例如,书中阐述了如何在有限的内存条件下处理大规模数据,通过空间换时间的策略实现高效的查找和排序。...

    IT人士必看书籍-编程珠玑(中文)

    在数据结构方面,《编程珠玑》涵盖了数组、链表、树、哈希表等常用的数据结构,并探讨了它们在不同场景下的应用与性能优化。对于使用Java语言的开发者而言,深入理解这些数据结构的特性和适用场景,是编写高效代码的...

Global site tag (gtag.js) - Google Analytics