自写打印日历类

在论坛上看到有人在问打印日历的程序,今天下午空闲的时候写了一个日历类,简单的写了几个方法。

calendar.h

#include <string>

using namespace std;

#ifndef CALENDAR_H

#define CALENDAR_H

class Calendar{

public:
	Calendar(){}
	void printAllMonth(const int &year);
	void printOneMonth(const int &year, const int &month);
	void printOneDay(const int &year, const int &month, const int &day);
private:
	int oneMonth[6][7];

	static string monthName[13];
	static string weekName[8];
	static int monthDays[13];

	int calOneDay(const int &year, const int &month, const int &day)const;
	void fillOneMonth(const int &year, const int &month);
	void init(const int &year);
	void printHead(const int &year, const int &month);
};

const int LINE_NUM = 6;
const int DAY_PER_LINE = 7;
const int MONTH_NUM = 12;

#endif

calendar.cpp

#include <string>
#include "calendar.h"
#include <cstdio>

/*********************************************************************/
/*通过Zeller's congruence来计算某年某月某日为周几author:csdn iaccepted
/*http://blog.csdn.net/iaccepted
*********************************************************************/
inline
int Calendar::calOneDay(const int &year, const int &month, const int &day)const{
	int m = month, j = year / 100, k = year % 100;

	if (month < 3){
		m += 12;
		//这里要注意,当月份小于3的时候,要把月份变成上年的13、14月份,所以年份也变成上年了
		j = (year - 1) / 100;
		k = (year - 1) % 100;
	}
	int res = (day + 13 * (m + 1) / 5 + k + (k / 4) + (j / 4) + 5 * j) % 7;
	return res;
}

/**********************************************************/
/*向月日历数组中填写本月的日历信息author:csdn iaccepted
/*(第一行的第一个位置即周日的位置永远不可能有元素)
/*http://blog.csdn.net/iaccepted
***********************************************************/
void Calendar::fillOneMonth(const int &year, const int &month){
	int first = calOneDay(year, month, 1);
	//返回的first规则(0-sat,1-sun,2-mon,3...)进过这个公式处理后的规则(1-mon, 2-tue, 3-wnd.....)
	first = ((first + 5) % 7) + 1; 

	int cnt = 1;

	memset(oneMonth, 0, sizeof(oneMonth));

	//仔细观察日历就会发现其实每个月的信息就是一个6*7的数组
	for (int i = first; cnt <= monthDays[month]; ++i){
		oneMonth[i / DAY_PER_LINE][i % DAY_PER_LINE] = cnt;
		++cnt;
	}
}

/******************************************************************/
/*通过调用打印某个月的函数来完成所有月份的打印author:csdn iaccepted
/*http://blog.csdn.net/iaccepted
*****************************************************************/
void Calendar::printAllMonth(const int &year){
	for (int i = 1; i <= MONTH_NUM; ++i){
		printOneMonth(year, i);
	}
}

/*********************************************************/
/*可以通过具体日期查询该日期是周几author:csdn iaccepted
/*http://blog.csdn.net/iaccepted
**********************************************************/
void Calendar::printOneDay(const int &year, const int &month, const int &day){
	int dayOfWeek = calOneDay(year, month, day);
	printf("%d-%02d-%02d : %s\n", year, month, day, weekName[dayOfWeek].c_str());
}

/*********************************************************/
/*对于特定的年份和月份,调用fillOneMonth函数
/*在月份表中填写本月日历信息,并正常打印出来csdn iaccepted
/*http://blog.csdn.net/iaccepted
**********************************************************/
void Calendar::printOneMonth(const int &year, const int &month){
	if (month == 2){
		init(year);
	}
	fillOneMonth(year, month);
	printHead(year, month);
	for (int i = 0; i < LINE_NUM; ++i){
		for (int j = 0; j < DAY_PER_LINE; ++j){
			if (oneMonth[i][j] != 0){
				printf("%2d\t",oneMonth[i][j]);
			}
			else{
				printf("   \t");
			}
		}
		printf("\n");
	}
	printf("\n");
}

/********************************************************/
/*输入年份,来处理闰年和平年二月份天数的问题csdn iaccepted
/*http://blog.csdn.net/iaccepted
*********************************************************/
inline
void Calendar::init(const int &year){
	if ((year % 4 == 0 && year % 400 != 0) || (year % 400 == 0)){
		monthDays[2] = 29;
	}
	else{
		monthDays[2] = 28;
	}
}

/*********************************************/
/*输入年和月打印每个月的表头信息 csdn iaccepted
/*http://blog.csdn.net/iaccepted
**********************************************/
inline
void Calendar::printHead(const int &year, const int &month){
	printf("%d-%02d\t %s\n",year,month,monthName[month].c_str());
	printf("Sun\tMon\tTue\tWed\tThu\tFri\tSat\n");
}

int Calendar::monthDays[13] = {0, 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
string Calendar::monthName[13] = {" ", "January", "February", "March", "Apirl", "May", "June", "July", "August", "September", "October", "November", "December"};
string Calendar::weekName[8] = { "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri" };

注释写的很详细了,不多做解释了。

自写打印日历类

时间: 2024-10-12 09:18:41

自写打印日历类的相关文章

Java中的日历类/集合类/数学类/正则表达式/数组工具类等的常用方法与基本功能

一. Arrays 针对数组操作的工具类,提供了一些针对数组排序和二分搜索的方法.常用方法:1.public static String toString(int[] a):将int类型的数组转换成字符串.转换成字符串后输出形式: ([元素1,元素2,元素3...]),Arrays在底层重写了toString方法.2.public static void sort(int[] a):对指定的 int 型数组按数字升序进行排序.3.public static int binarySearch(in

写shell工具类,一个常用实例

简述: 当我们常用到某些指令时,我们就需要将这个命令进行封装.封装的设计和扩展,因人而异.但为了每个人都能够了解到这个命令,常需要写出这个类的help. 关键字: 函数.getopts 函数 通过自定义函数(可参阅:http://www.runoob.com/linux/linux-shell-func.html),能够实现过程操作.输入捕获(read).输出获取(return). getopts 为了获取用户在命令下的参数,通过该命令来操作(可参阅:https://blog.csdn.net/

Python实战练习——打印日历教程

很长一段时间没有接触过C语言了,想来做这一行当已经有三两年了. 今天突然想起来以前用C语言在VC6上写代码的日子,想了想以前的一些实战练习. 所以今天打算用Python来写一个C语言以前练习的题目-日历打印器,并根据情况进行优化. 效果如上图所示 算法思路: 首先,关于日历的相关操作都离不开一个根本情况,1990年的1月1日是周一,所以日历的打印需要基于这一事实 想要打印日历需要解决的问题最主要便是一个——那就是本月1号是周几? 在没有更好的算法之前,最好用的方式就是根据接收的年月去累加,然后除

java中IO写文件工具类

下面是一些根据常用java类进行组装的对文件进行操作的类,平时,我更喜欢使用Jodd.io中提供的一些对文件的操作类,里面的方法写的简单易懂. 其中jodd中提供的JavaUtil类中提供的方法足够我们使用,里面的方法写的非常简练,例如append,read等方法,封装更好,更符合面向对象, 这里面我写的一些方法可多都是模仿jodd,从里面进行抽取出来的. /** * 获取路径文件夹下的所有文件 * @param path * @return */ public static File[] ge

iOS 日历类(NSCalendar)

对于时间的操作在开发中很常见,但有时候我们需要获取到一年后的时间,或者一周后的时间.靠通过秒数计算是不行的.那就牵扯到另外一个日历类(NSCalendar).下面先简单看一下 NSDate let date = NSDate()let formatter = NSDateFormatter() formatter.dateFormat = "yyyy-MM-dd HH-mm-ss"formatter.stringFromDate(date)// 延迟多少秒为正数 前多少秒为负数let

【Java自学】 打印日历信息

1 package codeTask_FangFa; 2 // 5.34 使用zeller公式,打印某年某月的日历信息. 3 import java.util.Scanner; 4 public class PrintRiLi { 5 public static void main(String[] args){ 6 Scanner input = new Scanner(System.in); 7 System.out.println("请输入需要打印日历的年份:"); 8 int

java打印日历方法

package cn.baokx.test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class Test { public static void main(String ... args) { String dat

js写个日历

其实我是一个对时间和日期不怎么感兴趣的人,小学的时候感觉时间或者日期那块就让我很晕,因为有时候是100进制有时候是60进制,搞的我对日历一直很不感兴趣,最近不知道为什么想写一个日历了,可想而知,这个玩意对我的大脑会造成多大的伤害,很简单的. <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>日历</title> <style type=

Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

#29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类Truck是Car类的子类,其中包含的属性有载重量payload.每个 类都有构造方法和输出相关数据的方法.最后,写一个测试类来测试这些类的功 能. package hanqi; public class Vehicle { private int wheels; private int weight