欢迎来到【最佳威廉指标源码】【linux udp攻击源码】【全民养鲲源码】mfc源码实例-皮皮网网站!!!

皮皮网

【最佳威廉指标源码】【linux udp攻击源码】【全民养鲲源码】mfc源码实例-皮皮网 扫描左侧二维码访问本站手机端

【最佳威廉指标源码】【linux udp攻击源码】【全民养鲲源码】mfc源码实例

2024-11-30 02:43:06 来源:{typename type="name"/} 分类:{typename type="name"/}

1.mfc 编写万年历 怎么编 我是码实白痴 求指导
2.用MFC编写一个指针型时钟程序,时钟还具有闹钟和倒计时功能,码实求能在mfc里执行的码实整个文件
3.请问大家谁会用MFC编万年历?会的话麻烦把源代码发上来,谢了!码实

mfc源码实例

mfc 编写万年历 怎么编 我是码实白痴 求指导

       我这里有现成的代码,可供你参考,码实最佳威廉指标源码主要是码实自绘的实现,附件给你两个版本的码实,均是码实MFC的(如下图)。

       第一个是码实摘自网上的程序,但经我改良,码实农历数据使用自创的码实算法,年份支持也大大增加(从公元年至年),码实并且修正了部分错误。码实

       第二个是码实自创的,是MFC绘制出来的界面,支持两种视图。

       代码都是在VS上编译通过的,如需要源代码,请追问。

//判断闰年,参数:年份,linux udp攻击源码闰年,返回值:FALSE-失败,TRUE-成功

        static BOOL IsLeapYear(WORD dwYear,BOOL &bLeapYear);

        //计算日期在年内的序数,参数:年,月,日,年内序数,返回值:FALSE-失败,TRUE-成功

        static BOOL GetDaysNumInYear(WORD dwYear, WORD dwMonth, WORD dwDay,WORD &nDays);

        //从年内序数计算月、日,参数:年,年内序数,月,日,返回值:FALSE-失败,TRUE-成功

        static BOOL GetDateFromDays(WORD dwYear, WORD nDays, WORD &dwMonth, WORD &dwDay);

        //获取农历新年的公历年内序数,参数:农历年,返回值:农历新年的公历年内序数

        static short LunarGetNewYearOrdinal(WORD dwLunarYear);

        //获取农历月的天数,参数:农历年,农历月,是全民养鲲源码否为闰月,返回值:该农历月的天数,为0代表参数无效

        static WORD LunarGetDaysofMonth(WORD dwLunarYear,WORD dwLunarMonth,BOOL bLeapMonth);

        //获取农历某一年的闰月情况,参数:农历年,返回值,该年的闰月月份,0表示无闰月

        static WORD LunarGetLeapMonth(WORD dwLunarYear);

        //公历转农历,参数:公历年、月、日,农历年、月、日,是否为闰月,返回值:FALSE-失败,TRUE-成功

        static BOOL GetLunar(WORD dwYear,WORD dwMonth,WORD dwDay,WORD &dwLunarYear,WORD &dwLunarMonth,WORD &dwLunarDay,BOOL &bLeapMonth);

        //农历转公历,参数:家历年、月、日,是否为闰月,公历年、月、bcd码和源码日,返回值:FALSE-失败,TRUE-成功

        static BOOL GetGregorian(WORD dwLunarYear,WORD dwLunarMonth,WORD dwLunarDay,BOOL bLeapMonth,WORD &dwYear,WORD &dwMonth,WORD &dwDay);

        //得到指定年份的节气信息,首个是小寒

        static BOOL GetJieQi(WORD dwYear,WORD dwMonth,WORD dwJieQi[2]);

        //计算星期,返回-1表示输入的年月日不正确或者超出年份范围

        static short GetDayOfWeek(WORD dwYear,WORD dwMonth,WORD dwDay);

        //计算某个月的天数,返回天数,如果返回0表示年或月有误

        static WORD GetDaysOfMonth(WORD dwYear,WORD dwMonth);

        //把iYear年格式化成天干记年法表示的字符串

        static void FormatLunarYear(WORD  iYear, char *pBuffer);

        //把iMonth格式化成中文字符串

        static void FormatLunarMonth(WORD iMonth, char *pBuffer, BOOL bLeapMonth=FALSE);

       //把iDay格式化成中文字符串

        static void FormatLunarDay(WORD  iDay, char *pBuffer);

        

用MFC编写一个指针型时钟程序,时钟还具有闹钟和倒计时功能,求能在mfc里执行的整个文件

       一、程序窗口设计步骤

       (1)用AppWizard生成一个名为Clock的单文档(SDI)程序框架。为了简化应用程序,在第四步时去掉Docking toolbar和Initial status bar选择项(不删除也可),其他各选项均可用缺省设置。

       (2)编辑项目的菜单资源,在主框架窗口的主菜单(IDR_MAINFRAME)中添加一个名为“时钟控制”的下拉菜单。在“时钟控制”菜单中添加三个菜单选项“启动时钟”、“停止时钟”和“时间设置”。并在菜单属性项中设定“启动时钟”菜单的ID标号为ID_START,“停止时钟”菜单的ID标号为ID_STOP,“时间设置”菜单的ID标号为ID_SETTIME。为了简化菜单,window编译wireshark源码可删除系统原有的“文件”、“编辑”菜单项。

       (3)利用ClassWizard为视图类添加菜单命令处理函数。进入ClassWizard的Message Maps选项卡,选择Class Name项为CClockView类,在Object IDs列表框中分别选择新添加的菜单选项的ID,在Messages列表框中选择COMMAND,按下Add Function按钮添加成员函数。ClassWizard会为“启动时钟”、“停止时钟”和“时间设置”菜单选项添加相应的消息响应函数OnStart ( )、OnStop ( )和OnSettime ( )。

       (4)利用ClassWizard为视图类添加定时器和鼠标消息处理函数。进入ClassWizard的Message Maps选项卡,选择Class Name项为 CClockView类,在Messages列表框中分别选择定时器消息WM_TIMER和鼠标消息WM_LBUTIONDOWN,按下Add Function按钮添加成员函数。ClassWizard会添加相应的定时器和鼠标消息响应函数OnTimer和OnLButtonDown。

       (5)使用Developer Studio菜单的Insert / Resource…选项调出Insert Source对话框,为项目添加新的对话框资源。在对话框属性中,修改对话框名为“时间设定”。在对话框中增加用来输入年、月、日、时、分、秒的编辑框控件。

        通过控件属性,将年、月、日、时、分、秒等编辑控件的ID改为IDC_YEAR、IDC_MONTH、IDC_DAY、IDC_HOUR、IDC_MINUTE和IDC_SECOND。

       (6)利用ClassWizard自动建立对话框类。进入ClassWizard后,弹出一个对话框询问是否要为该对话框模板建立类。按下“OK”按钮,会弹出New Class对话框,在Name栏填写对话框类的名称CSetTimeDlg后按“OK”按钮,即可为对话框创建一个对应的类。

       (7) 利用ClassWizard为对话框类添加与各控件对应的数据成员。选择MemberVariables选项卡,确保Class Name项为对话框CSetTimeDlg类,然后在选项卡下方的窗口中选择各控件的ID并按下“Add Variable…”按钮,为其添加对应成员变量。

       控制ID

       变量类型

       变量名

       变量范围

       IDC_YEAR

       int

       m_Year

       0~

       IDC_MONTH

       int

       m_Month

       1~

       IDC_DAY

       int

       m_Day

       1~

       IDC_HOUR

       int

       m_Hour

       0~

       IDC_MINUTE

       int

       m_Minute

       0~

       IDC_SECOND

       int

       m_Second

       0~

       最后一列为变量取值范围。

       (8)编辑工程的图标资源,在Resource View选项窗口中修改Icon结点所包含的主框架图标(IDR_MAINFRAME)。此步非必须。

       (9)完成以上工作后,即可修改程序框架,添加必要的代码。

       二、主要源代码:

       按以下步骤向视图类(CClockView)添加下列数据成员及成员函数。

       (1) 添加表示年、月、日、时、分、秒的变量。

        int year;

        int month;

        int day;

        int hour;

        int minute;

        int second;

       (2) 添加秒表的计数变量。

        int watch;

       (3) 添加时钟的画笔及画刷变量。

       CPen m_HouPen, m_MinPen, m_SecPen; // 各种针的画笔

       CBrush m_MarkBrush; // 表盘标记的画刷

       (4) 添加时钟控制变量。

       CPoint m_Center; // 表的中心

       double m_Radius; // 表的半径

       CPoint m_Hour [2], m_OldHour [2]; // 时针当前及前一次位置

       CPoint m_Minute [2], m_OldMin [2]; // 分针当前及前一次位置

       CPoint m_Second [2], m_OldSec [2]; // 秒针当前及前一次位置

       (5) 添加秒表的两个按钮位置变量。

       CRect m_WatchStart;

       CRect m_WatchStop;

       (6) 添加两个函数,计算时钟各指针位置。

       void SetClock (int hour, int minute, int second);

       CPoint GetPoint (int nLenth, int nValue);

       (7) 在视图类构造函数中增加初始化语句,之前加上头文件

       #include<ctime>

       CClockView::CClockView()

       {

       // 设定时间

       char time[];

       SYSTEMTIME st;

       GetLocalTime(&st);

       day = st.wDay;

       hour = st.wHour;

       minute = st.wMinute;

       month = st.wMonth;

       second = st.wSecond;

       year = st.wYear;

       // 设定画笔/画刷

       m_HouPen. CreatePen (PS_SOLID, 5, RGB (, 0, 0) ); // 时针画笔

       m_MinPen. CreatePen (PS_SOLID, 3, RGB (0, 0, ) ); // 分针画笔

       m_SecPen. CreatePen (PS_SOLID, 1, RGB (0, 0, 0) ); // 秒针画笔

       m_MarkBrush. CreateSolidBrush (RGB (, , 0) );

       // 设定表心位置

       m_Center. x = ;

       m_Center. y = ;

       // 设定时钟半径

       m_Radius = ;

       // 计算指针位置

        SetClock (hour, minute, second);

        // 设定秒表计数器及按钮位置

       watch = 0;

       m_WatchStart = CRect (, , , ); // 启动钮

       m_WatchStop = CRect (, , , ); // 停止钮

       }

       编写指针位置计算函数SetClock和GetPoint。首先在ClockView. cpp文件头部添加下面两行代码,以便进行数学计算。

       #include "math.h"

       #define PI 3.

       然后添加下列代码:

       //计算各个指针位置的函数

       void CClockView::SetClock(int hour, int minute, int second)

       {

       hour=hour*5;

       hour=hour+minute/;

       // 保存时针原位置

       m_OldHour [0] = m_Hour[0];

       m_OldHour [1] = m_Hour[1];

       // 计算时针当前位置

       m_Hour[0]= GetPoint(int(m_Radius/2),hour);

       m_Hour[1]= GetPoint(7,hour + );

       // 保存分针原位置

       m_OldMin[0]= m_Minute[0];

       m_OldMin[1]= m_Minute[1];

       // 计算分针当前位置

       m_Minute[0]=GetPoint(int(m_Radius*7/), minute);

       m_Minute[1]=GetPoint(, minute+);

       // 保存秒针原位置

       m_OldSec [0] = m_Second [0];

       m_OldSec [1] = m_Second [1];

       // 计算秒针当前位置

       m_Second [0]= GetPoint (int(m_Radius * 8/), second);

       m_Second [1] = GetPoint (, second + );

       }

       // 计算以表心为原点的指针的端点位置

       CPoint CClockView ::GetPoint (int nLenth, int nValue)

       {

       CPoint p;

       double angle = nValue* PI /-PI/2;

       p.x = m_Center.x + (int) (nLenth * cos(angle));

       p.y = m_Center.y + (int) (nLenth * sin(angle));

       return p;

       }

       绘制表盘上的标记、时针、分针和秒针,并显示数字时钟及秒表,在OnDraw函数中添加下面代码:

       void CClockView::OnDraw(CDC* pDC)

       {

       CClockDoc* pDoc = GetDocument();

       ASSERT_VALID(pDoc);

       // 绘制表盘上的标记

       pDC->SelectObject(m_MarkBrush);

       int k=0;

       for(int i=0;i<;i++)

       {

       CPoint pt=GetPoint(,i);

       if (i%5==0)

       {

       //显示表盘上的数字

       CString str[]={ "","1","2","3","4","5","6","7","8","9","",""};

        pDC->TextOut(pt.x-5,pt.y-5,str[k]);

       k++;

       }else

       {

       //显示数字之间的圆圈

       pDC->Ellipse(pt.x-2,pt.y-2,pt.x+2,pt.y+2);

       }

       }

       // 画时针

       pDC->SelectObject (m_HouPen);

       if (m_OldHour[0]!= m_Hour[0])

       {

       // 用白色覆盖原位置时针

       pDC->SetROP2(R2_WHITE);

       pDC->MoveTo(m_OldHour [0] );

       pDC->LineTo(m_OldHour [1] );

       pDC->SetROP2(R2_COPYPEN);

       //时针绘制

       pDC->MoveTo(m_Hour[0]);

       pDC->LineTo(m_Hour[1]);

       }

       else

       {

       // 时针绘制

       pDC->MoveTo(m_Hour[0]);

       pDC->LineTo(m_Hour[1]);

       }

       // 画分针

       pDC->SelectObject (m_MinPen);

       if (m_OldMin[0]!=m_Minute[0])

       {

       // 用白色覆盖原位置分针

       pDC->SetROP2(R2_WHITE);

       pDC->MoveTo(m_OldMin[0]);

       pDC->LineTo(m_OldMin[1]);

       pDC->SetROP2(R2_COPYPEN);

       // 分针绘制

       pDC->MoveTo(m_Minute[0]);

       pDC->LineTo(m_Minute[1]);

       }

       else

       {

       // 分针绘制

       pDC->MoveTo(m_Minute[0]);

       pDC->LineTo(m_Minute[1]);

       }

       // 用白色覆盖原位置秒针

       pDC->SelectObject(m_SecPen);

       pDC->SetROP2(R2_WHITE);

       pDC->MoveTo(m_OldSec[0]);

       pDC->LineTo(m_OldSec[1]);

       pDC->SetROP2(R2_COPYPEN);

       // 秒针绘制

       pDC->MoveTo(m_Second[0]);

       pDC->LineTo(m_Second[1]);

       // 数字时钟显示

       pDC->SelectStockObject(WHITE_BRUSH);

       pDC->Rectangle(,,,);

       pDC->TextOut(,,"当前时间");

       CString m_Date,m_Time;

       m_Date.Format ("% 4d年%4d月%4d日",year,month,day);

       pDC->TextOut(,,m_Date);

       m_Time.Format("%4d点%4d分%4d秒",hour,minute,second);

       pDC->TextOut(,,m_Time);

       // 秒表显示

       pDC->Rectangle(,,,);

       pDC->TextOut(,,"秒 表");

       int minSec= watch%;

       int Sec=(watch/)%;

       int Min=(watch/)/;

       m_Time.Format("% d: % d: % d",Min,Sec,minSec);

       pDC->TextOut(,,m_Time);

       pDC->Rectangle(&m_WatchStart);

       pDC->Rectangle(&m_WatchStop);

       pDC->TextOut(m_WatchStart.left + ,m_WatchStart.top + 5,"启动");

       pDC->TextOut(m_WatchStop.left + ,m_WatchStop.top + 5,"停止");

       }

       请注意将表示时间的整数转换为CString字符串类型的方法以及秒表的显示方法。另外,watch计数器以1/秒为计数单位,每达到则秒数加1。

       按照下列步骤增加时钟控制代码:

       修改Onstart和OnStop函数,设置时钟运动消息。按比正常时钟快倍的假定,ms产生一个消息。本程序采用和正常时间同步,即ms产生一个消息, 其代码为:

       void CClockView::OnStart()

       {

       SetTimer (1, , NULL);

       }

       void CClockView::OnStop()

       {

       KillTimer (1);

       }

       修改OnTimer函数,正确计算并处理年、月、日、时、分、秒等变量的联动变化 ,其代码为:

       void CClockView::OnTimer(UINT nIDEvent)

       {

       if (nIDEvent == 1)

       {

       second++; // 秒增加

       if (second>)

       {

       second=0;

       minute++; // 分增加

       }

       if (minute>)

       {

       minute= 0;

       hour++; // 小时增加

       }

       if (hour>)

       {

       hour=0;

       day++; // 日增加

       }

       switch(month)

       {

       case 1: // 大月

       case 3:

       case 5:

       case 7:

       case 8:

       case :

       case :

       if (day>)

       {

       day= 1;

       month++; // 月增加

       }

       break;

       case 4: // 小月

       case 6:

       case 9:

       case :

       if (day>)

       {

       day=1;

       month++; // 月增加

       }

       break;

       case 2:

       if (year%4 ==0 && day>) // 润二月

       {

       day=1;

       month++; // 月增加

       }

       if (year%4!=0 && day>) // 二月

       {

       day=1;

       month++;

       }

       break;

       }

       if (month > )

       {

       // 年增加

       year++;

       month=1;

       }

       SetClock (hour, minute, second);

       Invalidate (false);

       }

       // 秒表定时器消息处理

       if (nIDEvent == 2)

       {

       watch++;

       Invalidate (false);

       }

       CView::OnTimer(nIDEvent);

       }

       添加时间设置对话框代码。

       首先在ClockView. cpp文件头部添加下列语句:

       #include “SetTimeDlg. h”

       在时间设定对话框类的构造函数中,做如下修改,将初始日期设为当前时间,之前要加上头文件

       #include<ctime>

       CSetTimeDlg::CSetTimeDlg(CWnd* pParent /*=NULL*/)

       : CDialog(CSetTimeDlg::IDD, pParent)

       {

       //||AFX_DATA_INIT(CSetTimeDlg)

       char time[];

       SYSTEMTIME st;

       GetLocalTime(&st);

       m_Day = st.wDay;

       m_Hour = st.wHour;

       m_Minute = st.wMinute;

       m_Month = st.wMonth;

       m_Second = st.wSecond;

       m_Year = st.wYear;// ||AFX_DATA_INIT

       }

       最后,在OnSettime函数中添加代码如下:

       void CClockView::OnSettime()

       {

       CSetTimeDlg SetDlg;

       if (SetDlg.DoModal ()==IDOK)

       {

       year=SetDlg.m_Year;

       month= SetDlg.m_Month;

       day= SetDlg.m_Day;

       hour=SetDlg.m_Hour;

       minute=SetDlg.m_Minute;

       second=SetDlg.m_Second;

       }

       // 计算各指针位置

       SetClock (hour,minute,second);

       Invalidate (true);

       }

       按以下步骤设计秒表控制程序:

       在OnLButtonDown函数中增加下列内容,以便响应单击秒表启动、停止框所发出的消息:

       void CClockView::OnLButtonDown(UINT nFlags, CPoint point)

       {

       if (m_WatchStart.PtInRect(point))

       {

       watch=0;

       SetTimer(2,,NULL);

       }

       if (m_WatchStop.PtInRect(point))

       {

       KillTimer (2);

       }

       CView::OnLButtonDown(nFlags, point);

       }

       编译,连接,运行程序。

       运行结果:

请问大家谁会用MFC编万年历?会的话麻烦把源代码发上来,谢了!

       #include

       #include

       struct mon

       {

        int maxdata;

        int data;

       };

       void SeekWeekDay(void); //求某个日期对应的星期函数

       int WeekDay(int year, int month, int day); //根据输入的日期,返回对应的星期

       void HowManyDays(void);//求某年某月有的天数函数

       int MonthDays(int year, int month);//根据输入的年号和月份,返回该月的天数

       void PrintWeek(int weekday, FILE *fp);//打印星期几

       void PrintMonth(int month, FILE *fp); //打印月份

       void PrintData(); //打印日历

       int main(void)

       {

        int choice;

        while(1)

        {

        puts("------------------------------------------");

        puts("请输入您的选择:");

        puts("输入1求某个日期对应的星期");

        puts("输入2求某年某月有的天数");

        puts("输入3输出某年的日历");

        puts("输入4结束程序");

        puts("------------------------------------------");

        scanf("%d", &choice); fflush(stdin);

        switch(choice)

        {

        case 1: SeekWeekDay(); break;

        case 2: HowManyDays(); break;

        case 3: PrintData(); break;

        case 4: return 0;

        default: puts("输入错误,请重新输入"); break;

        }

        printf("\n"); printf("\n");

        }

        system("pause");

        return 0;

       }

       void HowManyDays(void) //求某年某月有的天数函数

       {

        int year, month, days;

        puts("请输入年号和月份:");

        scanf("%d%d", &year, &month); fflush(stdin);

        printf("你的输入为 %d年%d月,", year, month);

        days = MonthDays(year, month); //根据输入的年号和月份,返回该月的天数

        printf(" %d年%d月有%d天\n", year, month, days);

       }

       void SeekWeekDay(void) //求某个日期对应的星期函数

       {

        FILE *fp;

        int year, month, day, weekday;

        if ( (fp="fopen"("wnlweek.txt","w+")) == NULL)

        {

        fprintf(stderr,"\nError opening file\n");

        exit(1);

        }

        puts("请输入年,月, 日:");

        scanf("%d%d%d", &year, &month, &day); fflush(stdin);

        printf("你的输入为 %d年%d月%d日\n", year, month, day);

        weekday = WeekDay(year, month, day); //根据输入的日期,返回对应的星期

        printf("这天是 ");

        PrintWeek(weekday, fp); //打印星期几

       }

       void PrintWeek(int weekday, FILE *fp)//打印星期几

       {

        switch(weekday)

        {

        case 0 : fprintf(stdout, "%s","周日 "); fprintf(fp, "%s","周日 "); break;

        case 1 : fprintf(stdout, "%s","周一 "); fprintf(fp, "%s","周一 ");break;

        case 2 : fprintf(stdout, "%s","周二 "); fprintf(fp, "%s","周二 ");break;

        case 3 : fprintf(stdout, "%s","周三 "); fprintf(fp, "%s","周三 ");break;

        case 4 : fprintf(stdout, "%s","周四 "); fprintf(fp, "%s","周四 "); break;

        case 5 : fprintf(stdout, "%s","周五 "); fprintf(fp, "%s","周五 ");break;

        case 6 : fprintf(stdout, "%s","周六 "); fprintf(fp, "%s","周六 ");break;

        }

       }

       void PrintMonth(int month, FILE *fp) //打印月份

       {

        switch(month)

        {

        case 1 : fprintf(stdout, "%s","一 月 "); fprintf(fp, "%s","一 月 ");break;

        case 2 : fprintf(stdout, "%s","二 月 "); fprintf(fp, "%s","二 月 ");break;

        case 3 : fprintf(stdout, "%s","三 月 "); fprintf(fp, "%s","三 月 ");break;

        case 4 : fprintf(stdout, "%s","四 月 "); fprintf(fp, "%s","四 月 ");break;

        case 5 : fprintf(stdout, "%s","五 月 "); fprintf(fp, "%s","五 月 ");break;

        case 6 : fprintf(stdout, "%s","六 月 "); fprintf(fp, "%s","六 月 ");break;

        case 7 : fprintf(stdout, "%s","七 月 "); fprintf(fp, "%s","七 月 ");break;

        case 8 : fprintf(stdout, "%s","八 月 "); fprintf(fp, "%s","八 月 ");break;

        case 9 : fprintf(stdout, "%s","九 月 "); fprintf(fp, "%s","九 月 ");break;

        case : fprintf(stdout, "%s","十 月 "); fprintf(fp, "%s","十 月 ");break;

        case : fprintf(stdout, "%s","十一 月 "); fprintf(fp, "%s","十一 月 "); break;

        case : fprintf(stdout, "%s","十二 月 "); fprintf(fp, "%s","十二 月 "); break;

        }

       }

       int WeekDay(int year, int month, int day) //根据输入的日期,返回对应的星期

       {

        int i;

        int run="0", ping="0";

        long sum;

        for(i="1"; i {

        if(i%4==0 && i%!=0 || i%==0)

        run++;

        else

        ping++;

        }

        sum = *run + *ping;

        for(i="1"; i sum += MonthDays(year, i);

        sum += day; //计算总天数

        return (int)sum%7;

       }

       int MonthDays(int year, int month)//根据输入的年号和月份,返回该月的天数

       {

        switch(month)

        {

        case 1:

        case 3:

        case 5:

        case 7:

        case 8:

        case :

        case : return ;

        case 4:

        case 6:

        case 9:

        case : return ;

        case 2: if(year%4==0 && year%!=0 || year%==0)

        return ;

        else

        return ;

        default: puts("这是一个错误的月份!"); system("pause"); return 0;

        }

       }

       void PrintData(void)//打印日历,对输出格式的控制较复杂

       {

        FILE *fp;

        struct mon month[];

        int i, j, k;

        int year, mon, week;

        if ( (fp="fopen"("wnldata.txt","w+")) == NULL)

        {

        fprintf(stderr,"\nError opening file\n");

        exit(1);

        }

        puts("请输入年号:");

        scanf("%d", &year);

        fprintf(stdout, "--------------------------------------------------------------------------\n");

        fprintf(fp, "--------------------------------------------------------------------------\n");

        fprintf(stdout, "%d %s\n", year, "年"); fprintf(fp, "%d %s\n", year,"年");

        fprintf(stdout, "--------------------------------------------------------------------------\n");

        fprintf(fp, "--------------------------------------------------------------------------\n");

        for(i="1"; i<; i++) //存储该年每个月的总天数和初始日期

        {

        month[i].data = 1;

        month[i].maxdata = MonthDays(year, i);

        }

        for(i="0"; i<6; i++) //总共输出6排

        {

        for(j="1"; j<=2; j++)//每排输出2个月

        {

        mon = 2*i + j;

        fprintf(stdout, "%s", " "); fprintf(fp, "%s", " ");

        PrintMonth(mon, fp); //第一行打印月份

        fprintf(stdout, "%s", " "); fprintf(fp, "%s", " ");

        if(j==1)

        { fprintf(stdout, "\t"); fprintf(fp, "\t"); }

        }

        fprintf(stdout, "\n"); fprintf(stdout, "\n"); fprintf(fp, "\n"); fprintf(fp, "\n");

        for(j="1"; j<=2; j++)

        {

        for(k="0"; k<7; k++)

        {

        PrintWeek(k, fp); //第2行打印星期

        }

        fprintf(stdout, "\t"); fprintf(fp, "\t");

        }

        printf("\n"); fprintf(fp, "\n");

        for(j="1"; j<=2; j++)

        {

        mon = 2*i + j;

        week = WeekDay(year, mon, 1); //根据输入的日期,返回对应的星期

        //控制输出格式,把每月的1日打印在对应星期的下面

        fprintf(stdout, "%*d ", week*5+2, month[mon].data); fprintf(fp, "%*d ", week*5+2, month[mon].data);

        month[mon].data++;

        week++;

        while(week < 7) //接着在该行打印该周剩余的日期

        {

        fprintf(stdout, "%2d ", month[mon].data++); fprintf(fp, "%2d ", month[mon].data++);

        week++;

        }

        if(j==1)

        { fprintf(stdout, "\t"); fprintf(fp, "\t"); }

        }

        fprintf(stdout, "\n"); fprintf(stdout, "\n"); fprintf(fp, "\n"); fprintf(fp, "\n");

        //从第4行起打印该月剩余的日期,每7个一行;直至该月日期打印完毕

        while(month[2*i+1].data<=month[2*i+1].maxdata || month[2*i+2].data<=month[2*i+2].maxdata)

        {

        for(j="1"; j<=2; j++)

        {

        mon = 2*i + j;

        for(k="0"; k<7; k++)

        {

        if(month[mon].data<=month[mon].maxdata)

        { //如果该月日期未打印完,打印该日期

        fprintf(stdout, "%2d ", month[mon].data);

        fprintf(fp, "%2d ", month[mon].data);

        month[mon].data++;

        }

        else //否则输出空格

        { fprintf(stdout, " "); fprintf(fp," "); }

        }

        if(j==1)

        { fprintf(stdout, "\t"); fprintf(fp, "\t"); }

        }

        fprintf(stdout, "\n"); fprintf(stdout, "\n"); fprintf(fp, "\n"); fprintf(fp, "\n");

        }

        fprintf(stdout, "\n"); fprintf(fp, "\n");

        }

        fclose(fp);

       }