C/C++做日历查询代码

#include <time.h>
#include <windows.h>

#include <iostream>
#include <vector>
#include <iterator>

class _CMonthItem{

public:

int m_nYear;
int m_nMonth;

int m_nDaysOfMonth;
int m_nIndent;
int m_nRows;

protected:

static bool _is_leap_year(int y)
{
return (y%4==0 && y%100!=0) || y%400==0 ;
}

static int _num_of_days(int y, int m)
{
int n=0;
if( m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12){
n=31;
}else if(m==2){
if(_is_leap_year(y)){
n=29;
}else{
n=28;
}
}else if(m==4 || m==6 || m==9 || m==11){
n=30;
}
return n;
}

static int _indent_of(int y, int m)
{
struct tm tm0; memset(&tm0, 0, sizeof(tm0));

tm0.tm_year=y-1900;
tm0.tm_mon=m-1;
tm0.tm_mday=1;

time_t t=mktime(&tm0);
struct tm* p=localtime(&t);

return p ? p->tm_wday : 0;
}

static int _num_of_rows(int y, int m)
{
int nIndent=_indent_of(y, m);
int nDays=_num_of_days(y, m);
int nItems=nDays+nIndent;
int nRows=(nItems/7);
if(nItems%7>0) nRows++;
return nRows;
}

void init(int y, int m)
{
m_nYear=y;
m_nMonth=m;

m_nDaysOfMonth=_num_of_days(y, m);

m_nIndent=_indent_of(y, m);

m_nRows=_num_of_rows(y, m);
}

public:

_CMonthItem(int y=0, int m=0)
{
init(y, m);
}

};

std::string _transform_month(int i)
{
std::string sMonth;
switch(i){
case 1 :
sMonth="Jan";
break;
case 2 :
sMonth="Feb";
break;
case 3 :
sMonth="Mar";
break;
case 4 :
sMonth="Apr";
break;
case 5 :
sMonth="May";
break;
case 6 :
sMonth="Jun";
break;
case 7 :
sMonth="Jul";
break;
case 8 :
sMonth="Aug";
break;
case 9 :
sMonth="Sep";
break;
case 10 :
sMonth="Oct";
break;
case 11 :
sMonth="Nov";
break;
case 12 :
sMonth="Dec";
break;
}
return sMonth;
}

void _print(const std::vector<_CMonthItem>& vMonths, int iPos, int nCol)
{
int nRow=0;
std::cout << std::endl;
std::cout << std::endl;
for(int k=0; k<nCol; ++k){
const _CMonthItem& xMI=vMonths[iPos+k];
if(xMI.m_nRows>nRow){
nRow=xMI.m_nRows;
}
int num;
if(xMI.m_nMonth%nCol==1){
num=13;
}else{
num=14;
if(nCol==1){
num=13;
}
}
while(num){
std::cout << " ";
num--;
}
std::cout << _transform_month(xMI.m_nMonth).c_str();
num=13;
while(num){
std::cout << " ";
num--;
}
}

std::cout << std::endl;
for(int x=0; x<nCol; ++x){
if(x>0){
std::cout << " ";
}
std::cout << " SUN MON TUE WED THR FRI SAT";
}
std::cout << std::endl;
for(int m=0; m<nRow; ++m){
for(int k=0; k<nCol; ++k){
if(k>0){
std::cout << " ";
}
const _CMonthItem& xMI=vMonths[iPos+k];
int iDayStart=m*7-xMI.m_nIndent+1;
for(int j=0; j<7; ++j){
int nDay=iDayStart+j;
if(nDay<=0 || nDay>xMI.m_nDaysOfMonth){
std::cout << " ";
}else{
if(nDay<10){
std::cout << " ";
}
std::cout << " ";
std::cout << nDay;
}
}
}
std::cout << std::endl;
}
}

int _fprint(const std::vector<_CMonthItem>& vMonths, int iPos, int nCol, int month)
{
int nRow=0;
FILE *fp;
fp=fopen(".\\calendar.txt","a");
fprintf(fp,"\n\n");
for(int k=0; k<nCol; ++k){
const _CMonthItem& xMI=vMonths[iPos+k];
if(xMI.m_nRows>nRow){
nRow=xMI.m_nRows;
}
int num;
if(xMI.m_nMonth%nCol==1){
num=13;
}else{
num=14;
}
while(num){
fprintf(fp," ");
num--;
}
fprintf(fp,"%s",_transform_month(xMI.m_nMonth).c_str());
num=13;
while(num){
fprintf(fp," ");
num--;
}
}

fprintf(fp,"\n");
for(int x=0; x<nCol; ++x){
month++;
if(x>0){
fprintf(fp," ");
}
if(month<=12){
fprintf(fp," SUN MON TUE WED THR FRI SAT");
}
}
fprintf(fp,"\n");
for(int m=0; m<nRow; ++m){
for(int k=0; k<nCol; ++k){
if(k>0){
fprintf(fp," ");
}
const _CMonthItem& xMI=vMonths[iPos+k];
int iDayStart=m*7-xMI.m_nIndent+1;
for(int j=0; j<7; ++j){
int nDay=iDayStart+j;
if(nDay<=0 || nDay>xMI.m_nDaysOfMonth){
fprintf(fp," ");
}else{
if(nDay<10){
fprintf(fp," ");
}
fprintf(fp," ");
fprintf(fp,"%d",nDay);
}
}
}
fprintf(fp,"\n");
}
fclose(fp);
return month;
}

int main(void)
{
int nYear=0, nCol=2;
int month=0;
std::cout << "Input a year: ";
std::cin >> nYear;

std::cout << "Input a column number: ";
std::cin >> nCol;

if(nYear>1900 && nCol>0){

int nRows=12/nCol;
if((12%nCol)>0) nRows++;

std::vector<_CMonthItem> vMonths;
for(int j=0; j</*nRows*/12; ++j){
_CMonthItem xMI(nYear, j+1);
vMonths.push_back(xMI);
}
if(nCol<3){
std::cout << std::endl << nYear << std::endl;
}else{
FILE *fp;
fp=fopen(".\\calendar.txt","a");
fprintf(fp,"=========\n%d\n",nYear);
fclose(fp);
}
FILE *fp;
fp=fopen(".\\calendar.txt","w");
fclose(fp);
for(int i=0; i<nRows; ++i){
if(nCol<3){
_print(vMonths, i*nCol, nCol);
}else{
fp=fopen(".\\calendar.txt","a");
month=_fprint(vMonths, i*nCol, nCol, month);
fclose(fp);
}
}
if(nCol>2){
std::cout << "\nNumber of columns are more than two, so auto output in the file calendar.txt,\nits path is path of calendar.exe.\n"
<< std::endl;
ShellExecute(NULL, "open", ".\\calendar.txt", NULL, NULL, SW_SHOWNORMAL);
}
}

system("pause");
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值