日期处理器 高质量C语言程序
一、C语言程序的结构

一、C语言程序的结构C语言程序的结构是怎样的呢?首先,我们要了解C语言程序的基本组成部分。
C语言程序是由预处理器指令、源代码和目标代码三部分构成的。
1.预处理器指令:预处理器指令通常位于程序的最顶部,用于包含头文件、定义常量等。
例如,#include <stdio.h>就是预处理器指令,它告诉编译器在实际编译之前要包含stdio.h文件。
2.源代码:源代码是程序员实际编写的程序部分,位于预处理器指令之后。
源代码是用C语言编写的,包括数据类型、变量、函数、控制结构等。
3.目标代码:目标代码是编译器将源代码转换成的机器语言代码,用于在计算机上运行程序。
接下来,我们来看一个简单的C语言程序的例子:#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}这个程序的结构非常简单。
首先,它有一个预处理器指令#include<stdio.h>,它告诉编译器在实际编译之前要包含stdio.h文件。
然后,它有一个main函数,这是C程序的入口点。
在main函数中,它有一个printf语句,用于在屏幕上打印"Hello, World!"。
最后,它有一个return语句,用于结束main函数并返回值0。
除了以上三个部分外,C语言程序还包含了一些其他元素,如注释、宏定义等。
注释用于解释程序的功能和作用,宏定义用于定义常量或简单函数。
这些元素虽然不是必须的,但它们可以帮助程序员更好地理解和维护程序。
总之,C语言程序的结构相对简单明了,主要由预处理器指令、源代码和目标代码三部分组成。
程序员需要掌握这些基本组成部分及其作用,才能更好地编写和理解C程序。
同时,程序员还需要了解C语言的语法规则、数据类型、控制结构、函数等基础知识,才能更好地应用C语言进行编程。
c程序设计语言(第2版)

c程序设计语言(第2版)C程序设计语言(第2版)是一本经典的计算机编程教材,由著名的计算机科学家Brian W. Kernighan和Dennis M. Ritchie共同撰写。
这本书首次出版于1978年,第2版于1988年出版。
它通常被简称为K&R,是C语言编程的权威指南,对初学者和有经验的程序员都具有极高的参考价值。
书籍概述这本书全面介绍了C语言的语法、语义和编程技巧。
它不仅涵盖了C语言的基本元素,如变量、运算符、控制结构、函数和数组,还深入探讨了更高级的主题,包括指针、结构、联合、枚举、位操作和预处理器。
第一部分:基础第一部分主要介绍了C语言的基础知识。
它解释了C语言的基本数据类型和运算符,以及如何使用它们来执行基本的算术和逻辑运算。
此外,它还介绍了控制流语句,如if语句、switch语句、while循环和for循环,这些是任何编程语言中实现条件和循环逻辑的基础。
第二部分:函数第二部分专注于函数的定义和使用。
函数是C语言中实现代码重用和模块化的关键。
这部分详细讨论了函数的定义、声明、调用以及如何传递参数。
它还介绍了递归函数的概念,这是一种特殊的函数,它在执行过程中调用自身。
第三部分:指针第三部分深入探讨了指针的概念。
指针是C语言中非常强大的特性,允许程序员直接操作内存地址。
这部分解释了指针的基本概念,包括如何声明指针、指针的算术运算以及指针与数组的关系。
此外,它还介绍了指针在函数参数传递中的应用,以及如何使用指针实现动态内存分配。
第四部分:结构、联合和枚举第四部分介绍了C语言中的复合数据类型,包括结构、联合和枚举。
结构允许将不同类型的数据组合成一个单一的数据类型,联合允许在同一内存位置存储不同的数据类型,而枚举提供了一种定义命名常量的方法。
这部分还讨论了如何使用这些复合类型来创建复杂的数据结构。
第五部分:预处理器和宏第五部分介绍了C语言的预处理器和宏。
预处理器提供了一种在编译之前处理源代码的方法,包括文件包含、条件编译和宏定义。
C语言技术中的CPU和内存使用率优化方法

C语言技术中的CPU和内存使用率优化方法在计算机科学领域,C语言是一种广泛应用的编程语言,被用于开发各种软件和系统。
然而,在编写C语言程序时,我们需要考虑到CPU和内存的使用率,以确保程序的性能和效率。
本文将探讨一些优化方法,帮助我们提高C语言程序的CPU和内存使用率。
一、减少CPU的使用率1. 合理使用循环结构循环结构是C语言中常用的控制结构,但过多的循环可能会导致CPU的过度使用。
因此,在编写循环时,我们应该尽量避免不必要的循环,或者通过优化算法来减少循环的次数。
例如,可以使用二分查找算法代替线性查找算法,以减少循环次数。
2. 使用并行化技术并行化技术可以将一个任务分解为多个子任务,并在多个处理器上同时执行,从而提高CPU的利用率。
在C语言中,我们可以使用多线程编程技术来实现并行化。
通过将任务分配给不同的线程,可以使CPU同时执行多个任务,提高程序的并发性和性能。
3. 避免频繁的系统调用系统调用是C语言中与操作系统交互的重要方式,但频繁的系统调用会导致CPU的使用率增加。
因此,在编写程序时,我们应该尽量避免频繁的系统调用,可以通过合并多个系统调用、使用缓存等方式来减少系统调用的次数,从而降低CPU的使用率。
二、优化内存使用率1. 合理使用数据结构数据结构是C语言中用于存储和组织数据的重要方式。
不同的数据结构对内存的使用率有所不同,因此,在选择数据结构时,我们应该根据实际需求和性能要求来选择合适的数据结构。
例如,使用数组代替链表可以减少内存的使用,但会增加访问元素的时间复杂度。
2. 及时释放内存在C语言中,我们需要手动分配和释放内存。
如果我们在程序中没有及时释放不再使用的内存,就会导致内存泄漏,从而降低内存的使用率。
因此,我们应该养成良好的内存管理习惯,在不再使用内存时及时释放,以提高内存的使用效率。
3. 使用内存池技术内存池是一种优化内存使用的技术,它通过预先分配一块连续的内存空间,并在程序中重复使用这块内存空间,避免了频繁的内存分配和释放操作。
c语言程序设计电子书

c语言程序设计电子书C语言程序设计是一门基础且广泛应用的编程语言课程,它以其高效、灵活和强大的功能而著称。
C语言由丹尼斯·里奇(Dennis Ritchie)在20世纪70年代初期于贝尔实验室开发,至今仍是许多系统软件和应用软件的首选语言。
本电子书将从C语言的基本概念、语法结构、数据类型、控制结构、函数、数组、指针、结构体、文件操作等方面进行详细介绍。
第一章:C语言概述C语言是一种过程式编程语言,它支持结构化编程。
C语言的设计哲学是提供一种通用、高效、易于使用的语言,同时保持对硬件的控制。
C 语言广泛应用于操作系统、嵌入式系统、高性能计算等领域。
第二章:C语言环境和基本语法在开始编写C程序之前,需要配置C语言开发环境,如GCC编译器。
C 程序的基本结构包括预处理指令、函数、变量声明和语句。
程序从`main`函数开始执行。
第三章:数据类型和变量C语言提供了多种数据类型,包括整型、浮点型、字符型等。
变量是程序中存储数据的容器,需要先声明后使用。
C语言是静态类型语言,每种变量在使用前必须指定数据类型。
第四章:运算符和表达式C语言提供了丰富的运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符等。
表达式是由变量、常量和运算符组成的组合,用于执行计算。
第五章:控制结构控制结构是程序流程控制的基本构件。
C语言提供了三种基本的控制结构:顺序结构、选择结构(if语句、switch语句)和循环结构(for 循环、while循环、do-while循环)。
第六章:函数函数是C语言中实现代码复用的重要手段。
函数允许将代码组织成独立的块,每个块可以执行特定的任务。
C语言支持函数的定义、声明、调用和递归。
第七章:数组数组是相同数据类型元素的集合。
C语言支持一维数组和多维数组。
数组在内存中是连续存储的,这使得数组操作高效但也需要小心越界问题。
第八章:指针指针是C语言的核心特性之一。
指针变量存储的是另一个变量的内存地址。
c语言mktime使用方法

c语言mktime使用方法mktime函数是C语言中的一个时间处理函数,用于将一个时间结构(struct tm)转换为一个日历时间(time_t)。
在使用mktime 函数之前,需要先将时间信息存储在一个struct tm结构中,然后将该结构作为参数传递给mktime函数,即可得到对应的日历时间。
mktime函数的使用方法如下:```ctime_t mktime(struct tm *timeptr);```其中,timeptr是指向一个结构体tm类型的指针,该结构体包含了年月日时分秒等时间信息。
函数返回值为日历时间time_t类型。
在使用mktime函数之前,需要先创建一个struct tm结构体,并将时间信息填入该结构体中。
struct tm结构体定义如下:```cstruct tm {int tm_sec; // 秒int tm_min; // 分int tm_hour; // 小时int tm_mday; // 一月中的某一天int tm_mon; // 月份(从一月开始,0代表一月)int tm_year; // 年份(从1900年开始)int tm_wday; // 一周中的某一天(从周日开始,0代表周日) int tm_yday; // 一年中的某一天(从一月一日开始,0代表一月一日)int tm_isdst; // 夏令时标识符};```使用mktime函数的步骤如下:1. 创建一个struct tm结构体对象,并初始化其中的各个字段。
2. 调用mktime函数,并将struct tm结构体对象的地址作为参数传入。
3. 检查mktime函数的返回值,如果返回-1,则表示转换失败;否则,返回的值即为转换后的日历时间。
下面是一个使用mktime函数的示例代码:```c#include <stdio.h>#include <time.h>int main() {struct tm timeinfo;time_t result;// 设置struct tm结构体中的字段timeinfo.tm_year = 2022 - 1900; // 年份从1900年开始计算 timeinfo.tm_mon = 4 - 1; // 月份从0开始,4代表5月timeinfo.tm_mday = 1; // 1号timeinfo.tm_hour = 12; // 12点timeinfo.tm_min = 0; // 0分timeinfo.tm_sec = 0; // 0秒// 转换为日历时间result = mktime(&timeinfo);// 检查转换结果if (result == -1) {printf("转换失败\n");} else {printf("转换后的日历时间:%ld\n", result);}return 0;}```上述代码中,我们创建了一个struct tm结构体对象timeinfo,并填入了2022年5月1日12点的时间信息。
C语言程序设计第三版

c语言程序设计第三版C语言程序设计第三版是一本面向初学者和中级程序员的教材,它不仅涵盖了C语言的基础知识,还深入探讨了高级编程技巧和最佳实践。
这本书的第三版在前两版的基础上进行了更新和改进,以适应现代编程环境和教学需求。
第一章:C语言简介本章介绍了C语言的历史和特点,包括其结构化编程的特性和在操作系统、嵌入式系统等领域的广泛应用。
同时,也简要介绍了C语言的编译和运行过程。
第二章:C语言基础这一章是C语言编程的入门,涵盖了变量、数据类型、运算符和表达式等基本概念。
通过实例代码,读者可以学习到如何声明变量、进行算术运算和逻辑运算。
第三章:控制结构控制结构是程序流程控制的核心,本章详细介绍了条件语句(if、switch)、循环语句(for、while、do-while)以及跳转语句(break、continue、goto)的使用方法和应用场景。
第四章:函数函数是C语言模块化编程的基础,本章介绍了函数的定义、声明、调用以及参数传递。
此外,还探讨了递归函数和内联函数的概念。
第五章:数组和字符串数组是存储多个数据项的集合,而字符串则是特殊的字符数组。
本章讲解了一维数组、多维数组、字符串的声明、初始化和操作,以及字符串处理函数的使用。
第六章:指针指针是C语言中非常强大的特性,它允许程序员直接操作内存地址。
本章深入讲解了指针的基本概念、指针与数组的关系、指针的算术运算以及函数指针。
第七章:结构体和联合体结构体和联合体是C语言中用于创建复杂数据结构的工具。
本章介绍了如何定义和使用结构体、联合体以及枚举类型,以及它们在实际编程中的应用。
第八章:预处理器预处理器是C语言编译过程中的一个阶段,它处理源代码中的宏定义、文件包含和条件编译等指令。
本章解释了预处理器的工作原理和常用指令。
第九章:文件操作文件操作是程序与外部世界交互的一种方式。
本章介绍了文件的打开、关闭、读写和定位等操作,以及文件指针的使用。
第十章:动态内存分配动态内存分配允许程序在运行时分配和释放内存。
c语言程序设计第4版

c语言程序设计第4版C语言程序设计第4版C语言是一种通用的编程语言,由丹尼斯·里奇(Dennis Ritchie)在1972年于贝尔实验室开发。
自从其诞生以来,C语言以其高效、灵活和强大的功能,成为了系统编程、嵌入式编程以及操作系统开发等领域的主流语言。
随着技术的不断发展,C语言也在不断地更新和完善,以适应新的编程需求和挑战。
第一章:C语言概述C语言的设计哲学是提供一种简洁、高效的编程方式。
它支持结构化编程,允许程序员以模块化的方式构建程序。
C语言的语法简洁,但功能强大,能够实现高级语言的许多特性。
第二章:C语言基础在开始编写C程序之前,需要了解一些基本概念,如变量、数据类型、运算符和控制结构。
C语言提供了丰富的数据类型,包括整型、浮点型、字符型等,以满足不同的数据存储需求。
控制结构包括条件语句(if、switch)、循环语句(for、while、do-while)和跳转语句(break、continue、return)。
第三章:函数函数是C语言中实现代码复用的重要手段。
一个函数可以接收参数,执行特定的任务,并返回结果。
C语言支持函数的递归调用,也允许函数指针的使用,这为编写灵活的程序提供了可能。
第四章:数组和字符串数组是存储固定数量相同类型元素的集合。
C语言中的数组是静态的,其大小在编译时确定。
字符串在C语言中以字符数组的形式存在,以空字符('\0')作为结束标志。
第五章:指针指针是C语言中的核心概念之一。
它允许程序员直接操作内存地址,这为动态内存分配、数组操作等提供了极大的灵活性。
指针的高级使用包括指针数组、函数指针和指针的指针。
第六章:结构体和联合体结构体允许将不同类型的数据组合成一个单一的数据类型。
联合体则允许在同一内存位置存储不同的数据类型,但其大小取决于最大的成员。
第七章:预处理器C语言的预处理器提供了条件编译、宏定义和文件包含等功能,这使得代码更加模块化和可重用。
c语言程序设计第五版

c语言程序设计第五版C语言程序设计第五版C语言,作为计算机编程语言的元老之一,自1972年由丹尼斯·里奇(Dennis Ritchie)在贝尔实验室开发以来,一直以其高效、灵活和强大的特性在软件开发领域占据着重要地位。
随着计算机科学的发展,C语言也在不断地更新和改进,以适应新的编程需求和硬件环境。
《C语言程序设计》这本书,作为学习C语言的经典教材,已经发行到了第五版,它不仅包含了C语言的基础知识,还涵盖了许多高级特性和最佳实践。
第一部分:C语言基础1. C语言概述C语言是一种过程式编程语言,以其简洁的语法和对底层硬件的控制能力而闻名。
C语言的设计哲学是提供足够的功能来实现复杂的程序,同时保持语言的简洁性。
2. 开发环境搭建在开始编写C程序之前,需要设置开发环境。
这通常包括安装编译器、编辑器和调试工具。
第五版教材会介绍如何在不同操作系统上搭建C语言的开发环境。
3. 基本语法C语言的基本语法包括变量声明、数据类型、运算符、控制结构(如if语句、循环)等。
这些是编写任何C程序的基础。
4. 函数函数是C语言中实现代码复用的重要机制。
教材会介绍如何定义函数、传递参数以及返回值的使用。
第二部分:数据结构与算法5. 数组数组是存储固定大小的同类型元素的集合。
教材会详细介绍一维数组和多维数组的使用,以及它们在程序设计中的应用。
6. 指针指针是C语言中一个强大的特性,它允许程序员直接操作内存地址。
第五版会深入讲解指针的基本概念、指针与数组的关系,以及指针在函数中的应用。
7. 字符串字符串是字符数组的一种特殊形式。
教材会介绍字符串的声明、操作和常用字符串处理函数。
8. 结构体和联合体结构体和联合体是C语言中用于创建复杂数据类型的工具。
第五版会讲解如何定义和使用这些数据结构。
第三部分:高级特性9. 预处理器预处理器是C语言编译过程中的一个工具,用于处理源代码中的宏定义、文件包含和条件编译等。
10. 文件操作C语言提供了丰富的文件操作API,允许程序员读写文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计题目:日期处理器2012年 09 月 06 日【程序功能简介】:程序能处理如2-12-2004或2/12/2004等格式的日期处理,并能进行日期的加法计算,输入日期的字符串形式,如1-MAR ——2003,同时还能进行两个日期的大小比较,返回两个日期相差的天数及月份数*【课程设计要求】*1将日期加天数的成员函数void AddDays (int days)改为重载+运算符2将计算两个日期相差天数的成员函数int FindDifferenceInDays(DateFormatter)改为重载—运算符3设计重载运算符‘—’的函数,实现日期对象减去天数的功能4设计重载运算符‘++’,‘——’的函数,实现日期对象自加、自减的功能5设计重载输入输出流函数,实现日期对象的输入、输出操作,要求输入能自动识别多种格式的日期方式,若日期数据有错(如输入的月份为13月等能自动予以提示并重新输入,输出时能同时输出各种格式的日期6修改main函数结构,采用菜单选项的形式,分别测试成员函数或重载运算符函数的功能注:运算符重载函数既可重载为成员函数也可以重载为友元函数*【源程序分析(包括结构、模块、功能)】*#include<iostream.h>#include<iomanip.h>#include<time.h>#include<string>using namespace std;class DateFormatter //日期格式类{private:int day;int mon;int year;public:DateFormatter();DateFormatter(int day,int mon,int year);DateFormatter(char* date);inline int GetDay(){ return day;} //返回日期inline int GetMonth(){ return mon;} //返回月份inline int GetYear(){ return year;} //返回年份inline void SetDay(int d){day=d;} //设置日期inline void SetMonth(int m){mon=m;} //设置月份inline void SetYear(int y){year=y;} //设置年份inline bool IsLeapYear() //查看是否是闰年{if(year%4==0&&year%100!=0||year%400==0){return true;}else {}}void AddDays(int days); //在日期上加上天数void MinDays(int days); //在日期上减去天数void IncrementMonth(); //在日期上加上月份char* GetDate();char* Time(int days,int mon,int year);int FindDifferenceInMonths(DateFormatter); //返回两个日期间月份的差值int FindDifferenceInDays(DateFormatter); //返回两个日期间天数的差值int FindDifferenceInMonth(DateFormatter);int FindDifferenceInDay(DateFormatter);static char* Today() //返回当前系统时间的字符串{const time_t curr=time(0);tm *dt=localtime(&curr);int d=dt->tm_mday;int y=(dt->tm_year+1900);int m=dt->tm_mon;char mn[4];strcpy(mn,FindMonth(m));char ret[25];strcpy(ret,FormatDate(d,mn,y));return ret;}char* GetFormattedDate();int operator<(DateFormatter df);int operator>(DateFormatter df);int operator==(DateFormatter df);int operator++();int operator--();private:static char* FindMonth(int m) //根据月份返回表示月份的字符串{ if(m==0) {return"JAN";}else if(m==1){return"FEB";}else if(m==2){return"MAR";}else if(m==3){return"APR";}else if(m==4){return"MAY";return"JUN";}else if(m==6){return"JUL";}else if(m==7){return"AUG";}else if(m==8){return"SEP";}else if(m==9){return"OCT";}else if(m==10){return"NOV";}else if(m==11){return"DEC";}else {return"NUL";}}int FindMonthInNumber(string m); //将用字符串表示的月份形式转换为数字形式static char* FormatDate(int d,char* m,int y) //将时间用字符串形式表示{char* dy=new char[25];char* yr=new char[25];dy=itoa(d,dy,10);yr=itoa(y,yr,10);strcat(dy,"-");strcat(dy,m);strcat(dy,"-");strcat(dy,yr);return dy;}string to_lower(string s); //将字符串中所有字母转换为小写int FindDaysInMonth(int m) //返回月份中的最大天数{ if(m==0){return 31;}else if(m==1){if(IsLeapYear()){return 29;}else {return 28;}}else if(m==2){return 31;return 30;}else if(m==4){return 31;}else if(m==5){return 30;}else if(m==6){return 31;}else if(m==7){return 31;}else if(m==8){return 30;}else if(m==9){return 31;}else if(m==10){return 30;}else if(m==11){return 31;}return -1;}};DateFormatter::DateFormatter() //构造函数,将成员数据赋值为当前系统时间{ const time_t curr=time(0);tm *dt=localtime(&curr);this->day=dt->tm_mday;this->mon=dt->tm_mon;this->year=(dt->tm_year+1900);}DateFormatter::DateFormatter(int day,int mon,int year) //构造函数,用指定时间设置成员函数{ this->day=day;this->mon=mon;this->year=year;}DateFormatter::DateFormatter(char* date) /*构造函数,将字符串表示的日期形式还原成整型,可以识别诸如1/1/03 1-12-2003等形式的字符串*/{if(strlen(date)>8){string s1=date;int p=s1.find_first_of('-'); //找到第一个'-',如12-2-2003string day;string year;if(p==2){day=s1.substr(0,2); //取出日期month=s1.substr(3,3); //取出月份year=s1.substr(7,4); //取出年份}else if(p==1){day=s1.substr(0,1);month=s1.substr(2,3);year=s1.substr(6,4);}char cday[5];strcpy(cday,day.c_str()); //日期转换为字符串char cyear[5];strcpy(cyear,year.c_str());this->day=atoi(cday); //将字符串转换为整型数字this->mon=FindMonthInNumber(month);this->year=atoi(cyear);}else if(strlen(date)==8|| strlen(date)==7|| strlen(date)==6){ int len=strlen(date);string str=date;string day;string month;string year;int p1=str.find_first_of('-');if(p1<=0) p1=str.find_first_of('/'); //如果格式中无'-',寻找'/' int p2=str.find_last_of('-');if(p2<=0) p2=str.find_last_of('/');if(len==8){day=str.substr(0,2); //同样将年、月、日转换成整型数字month=str.substr(3,2);year=str.substr(6,2);}else if(len==7){if(p1==1){day=str.substr(0,1);if(p2==3){month=str.substr(2,1);year=str.substr(4,2);}else{month=str.substr(2,2);year=str.substr(5,2);}}else{day=str.substr(0,2);month=str.substr(2,1);year=str.substr(4,2);}else{month=str.substr(3,2);year=str.substr(5,2);}}}else if(len==6){day=str.substr(0,1);month=str.substr(2,1);year=str.substr(4,2);}int m=atoi((month.c_str()));m-=1;int yr=atoi((year.c_str()));char y[5];if(yr>=0&&yr<=70) //再将年份前面补上世纪{ strcpy(y,"20");strcat(y,year.c_str());}else{strcpy(y,"19");strcat(y,year.c_str());}this->day=atoi((day.c_str()));this->mon=m;this->year=atoi(y);}}int DateFormatter::FindMonthInNumber(string m) //识别月份的英文形式,还原成整数{ if(to_lower(m)=="jan"){return 0;}else if(to_lower(m)=="feb"){return 1;}else if(to_lower(m)=="mar"){return 2;}else if(to_lower(m)=="apr"){return 3;}else if(to_lower(m)=="may"){return 4;}else if(to_lower(m)=="jun"){return 5;}else if(to_lower(m)=="jul"){return 6;return 7;}else if(to_lower(m)=="sep"){return 8;}else if(to_lower(m)=="oct"){return 9;}else if(to_lower(m)=="nov"){return 10;}else if(to_lower(m)=="dec"){return 11;}else{return -1;}}string DateFormatter::to_lower(string s) //将字符串中的大写转换成小写{ int len=s.length();for(int i=0;i<len;i++){if(s[i]>='A'&&s[i]<='Z'){s[i]=tolower(s[i]);}}return s;}char*DateFormatter::GetDate() //将以整型表示的日期转换为字符串的形式{ char* d=new char[25];char* m=new char[25];char* y=new char[25];d=itoa(day,d,10);m=itoa((mon+1),m,10);y=itoa(year,y,10);strcat(d,"/");strcat(d,m);strcat(d,"/");strcat(d,y);char ret[25];strcpy(ret,d);delete[]d;delete[]m;delete[]y;return ret;}char* DateFormatter::GetFormattedDate() //将用整数表示的时间改用字符串表示{ char mn[5];char ret[25];strcpy(ret,FormatDate(day,mn,year));return ret;}void DateFormatter::AddDays(int days) //日期加上天数成为一个新的日期,递归计算{ if(days<=0) return;int curr_day=this->day; //取对象当前日期int curr_mon=this->mon; //取对象当前月份int days_in_mon=FindDaysInMonth(curr_mon); //当前月份中共有多少天数if(this->mon==11&&days_in_mon==curr_day) //当月份为12月且当前日期为31天时{ this->year++; //对象年份加1}if(days_in_mon==curr_day) //当前日期计满时{ this->mon++; //当前月份加1this->day=0; //日期清零if(this->mon>11) //当前月份为12月,月份变为1月{ this->mon=0; }days_in_mon=FindDaysInMonth(this->mon); //新月份的天数}if(days<=days_in_mon) //相加的月数小于新月份的天数{ this->day+=days; //当前日期加上新天数if(this->day>days_in_mon) //若大于当前月份应有的天数{ this->mon++; //当前月份加1if(this->mon>11) //当前月份为12月,月份变为1月{ this->mon=0; }this->day-=days_in_mon; //当前天数标准化}return;}else //当相加的天数大于当前月份的天数时{ int days_to_add=days_in_mon-curr_day; //计算补满月份还需要的天数this->day+=days_to_add; //补满当前月份的天数if(this->day>days_in_mon) //天数多余当前月份{ this->day=1; //为第一号}int rem_days=days-days_to_add; //求出剩余的天数AddDays(rem_days); //递归计算return;}}期,递归计算{ if(days<=0) return;int curr_day=this->day; //取对象当前日期int curr_mon=this->mon; //取对象当前月份int days_in_mon;if(this->mon==0&&days_in_mon==1) //当月份为1月且当前日期为1天时{ this->year--; //对象年份减1}if(days<curr_day) //当相减的天数小于当前日期时{ this->day-=days;} //当前日期减去新天数else if(days==curr_day){this->mon--;this->day=FindDaysInMonth(this->mon);}else{this->mon--;days_in_mon=FindDaysInMonth(this->mon);int days_to_tot=days_in_mon+curr_day; //计算加上上个月的天数后的总天数if(days_to_tot>days) //总天数大于新天数{ this->day=days_to_tot-days; } //直接相减else if(days_to_tot==days){this->mon--;this->day=FindDaysInMonth(this->mon);}else{int rem_days=days-days_in_mon; //求出剩余的天数MinDays(rem_days); //递归计算return; }}}void DateFormatter::IncrementMonth() //月份加1{ mon++;if(mon>11){ mon=0;year++;}}int DateFormatter::FindDifferenceInMonths(DateFormatter dft) /*返回参数时间与对象时间相差的月份*/{ int diff=0;if(this->year==dft.year&&this->mon==dft.mon) return diff;if(dft.year>this->year){do{this->mon++;}while(this->year==dft.year&&this->mon==dft.mon);}else if(dft.year==this->year&&dft.mon>this->mon){do{this->mon++;diff++;}while(this->year==dft.year&&this->mon==dft.mon);}else{do{dft.mon++;diff++;}while(this->year==dft.year&&this->mon==dft.mon);}return diff;}int DateFormatter::FindDifferenceInDays(DateFormatter dft) //返回参数时间与对象时间相差的天数{ int diff=0;if(dft==*this) //参数时间等于对象时间{ return diff;} //返回差值while(dft>*this) //参数时间大于对象时间{ this->day++;diff++;dft++;}while(dft<*this) //参数时间小于对象时间{ dft.day++;diff++;dft++;}return diff;}int DateFormatter::operator<(DateFormatter df) //重载<运算符,对象时间大于参数时间返回1{ if(df.year>this->year){return 1;}else if(df.year==this->year&&df.mon>this->mon){return 1;}else if(df.mon==this->mon&&df.day>this->day){return 1;}else{return 0;}}int DateFormatter::operator>(DateFormatter df) //重载>运算符,对象时间小于参数时间返回1{ if(df.year<this->year){return 1;}else if(df.year==this->year&&df.mon<this->mon){return 1;}else if(df.mon==this->mon&&df.day<this->day){return 1;}else{return 0;}}int DateFormatter::operator==(DateFormatter df) //重载==运算符,对象时间等于参数时间返回1{ if((df.year==this->year)&&(df.mon==this->mon)&&(df.day==this->day)){return 1;}else{return 0;}}int DateFormatter::operator++() //重载++运算符{int curr_day=this->day; //取对象当前日期int curr_mon=this->mon; //取对象当前月份int days_in_mon=FindDaysInMonth(curr_mon); //当前月份中共有多少天数if(curr_day<days_in_mon){ //当天数少于该月最大天数this->day=curr_day+1;}else if(curr_mon<11){ //当月份小于12月this->mon=curr_mon+1;this->day=1;}else{ //年份加1this->year++;this->mon=1;this->day=1;}return 0;}int DateFormatter::operator--() //重载--运算符{int curr_day=this->day; //取对象当前日期int curr_mon=this->mon; //取对象当前月份if(curr_day>1){ //当天数多于1天this->day--;}else if(curr_mon>0){ //当月份大于一月this->mon--;this->day=FindDaysInMonth(this->mon);}else{ //年份减1this->year--;this->mon=12;this->day=30;}return 0;}char* DateFormatter::Time(int days,int mon,int year){int d;d=FindDaysInMonth(mon);if(days>d){ cout<<"您输入的日期有误,请重新输入"<<endl; }if(mon>11){ cout<<"您输入的月份有误,请重新输入"<<endl; }char mn[5];strcpy(mn,FindMonth(mon-1));char ret[25];strcpy(ret,FormatDate(days,mn,year));return ret;}int main() {int days=0;int mon=0;int year=0;char tmp[25],tmp2[25];DateFormatter dft("08/09/12");DateFormatter tmpdft("1/1/12");cout<<setw(30)<<"欢迎使用日期格式处理程序"<<'\n';cout<<setw(25)<<"制作人:林逸超"<<'\n';cout<<setw(27)<<"Today is:08/09/12 "<<endl;cout<<"1. 增加天数\n2. 减少天数\n3.日期比较\n4.日期自加\n5.日期自减\n0.退出\n";cout<<"请输入选择功能的相应序号:";int num;cin>>num;while(num){switch(num){case 1:cout<<"输入增加多少天"<<endl;cin>>days;dft.AddDays(days);strcpy(tmp,dft.GetFormattedDate());cout<<"结果是"<<tmp<<endl;cout<<"请输入选择功能的相应序号:";cin>>num;break;case 2:cout<<"输入减少多少天"<<endl;cin>>days;dft.MinDays(days);strcpy(tmp,dft.GetFormattedDate());cout<<"结果是"<<tmp<<endl;cout<<"请输入选择功能的相应序号:";cin>>num;break;case 3:cout<<"请按日/月/年的形式输入要比较的日期"<<endl;cin>>days>>mon>>year;strcpy(tmp,dft.GetFormattedDate());cout<<"First Date:"<<tmp<<endl;strcpy(tmp2,tmpdft.Time(days,mon,year));cout<<"Second Date:"<<tmp2<<endl;cout<<"Diff in days:"<<tmpdft.FindDifferenceInDays(dft)<<endl;cout<<"Diff in months:"<<tmpdft.FindDifferenceInMonths(dft)<<endl;cout<<"请输入选择功能的相应序号:";cin>>num;break;case 4:dft++;strcpy(tmp,dft.GetFormattedDate());cout<<"结果是"<<tmp<<endl;cout<<"请输入选择功能的相应序号:";cin>>num;break;case 5:dft--;strcpy(tmp,dft.GetFormattedDate());cout<<"结果是"<<tmp<<endl;cout<<"请输入选择功能的相应序号:";cin>>num;break;case 0:return 0;default:cout<<"您输入有误,请重新输入"<<endl;cout<<"请输入选择功能的相应序号:";cin>>num;break;}}return 0;}*【新程序设计思路】*1)类的结构该程序比较简单,类的结构也很合理,将课程设计中要求的各种重载运算符函数添加进去即可。