C语言课设课程设计万年历系统流程图
c语言编的万年历
万年历数字钟及可调时钟系统一、引言万年历数字钟是一种用万年历时钟芯片实现年、月、日、时、分、秒计时,并通过单片机处理后送给显示芯片显示的装置,与机械式时钟相比具有更高的准确性和直观性,且具有更长的使用寿命;本系统还可以扩展为可调的自动开关,对家电对用电设备进行控制,笔者在随后改制成为可调时的自动断电的供电系统.二、原理图设计1.单片机及其外围电路设计复位采用X25045芯片,复位电路如图1所示;图1 复位电路设计单片机采用贴片封装的AT89S51,晶振为;其中~为下载程序使用,电路如图2所示;图2 单片机89S51外围电路设计2.时钟芯片电路设计时钟芯片采用PCF8563,晶振采用,电容使用15pf;PCF8563 是PHILIPS 公司推出的一款工业级内含I2C 总线接口功能的具有极低功耗的多功能时钟/日历芯片;内部时钟电路、内部振荡电路、内部低电压检测电路以及两线制I2C 总线通讯方式,不但使外围电路及其简洁,而且也增加了芯片的可靠性;同时每次读写数据后,内嵌的字地址寄存器会自动产生增量;电路如图3所示;图3 时钟芯片电路设计3.显示芯片电路设计显示芯片采用ZLG7289,晶振为12MHz;ZLG7289A 是广州周立功单片机发展有限公司自行设计的,具有SPI 串行接口功能的可同时驱动8 位共阴式数码管或64 只独立LED 的智能显示驱动芯片,该芯片同时还可连接多达64 键的键盘矩阵,单片即可完成LED 显示﹑键盘接口的全部功能;电路如图4所示;图4 显示芯片电路设计4.双电源电路设计系统采用双电源,平时使用V1=10V的外接电源,停电时使用电池,由V2输入;电池有6节,其电压为9V;当电池电压低于6V时,LED亮,说明电池电量不足;电路如图5所示;图5 双电源电路设计三、程序设计程序开始时先对系统初始化,并设置好各种中断;下步操作主要是对时钟芯片进行操作,首先要给时钟芯片设置初值,时钟芯片便自行计数;此时检测是否有按键按下,按键是为了调整时钟;有按键按下则执行按键中断程序,没有按键按下则执行下一步的操作,即取时钟芯片中的时钟值,然后送显示;程序流程图如下;图6 总体流程图四、源程序include <>include <>include <>define uchar unsigned char /宏定义/define uint unsigned intuchar close_date,open_date;void RESWDIvoid;void WRENvoid;void WRDIvoid;void WRSRvoid;unsigned char RSDRvoid;void WIPCHKvoid;void OUTByteunsigned char Byte;unsigned char INPUTBytevoid;unsigned char ReadByteunsigned char ADD;void WriteByteunsigned char Byte,ADD;define _Nop _nop_ /定义空指令/sbit zlg7289_cs =P1^1;sbit zlg7289_clk =P2^6;sbit zlg7289_dio =P2^7;sbit zlg7289_key =P3^2;sbit p07=P0^7;sbit p06=P0^6;sbit CS=P2^4;sbit SCK=P2^2;sbit SO=P2^5;sbit SI=P2^3;sbit p10=P1^0;sbit SDA=P1^2; /模拟I2C数据传送位/sbit SCL=P1^3; /模拟I2C时钟控制位/uchar buf9={0x00,0x00,0x30,0x23,0x15,0x1,0x05,0x04,0x05}; uchar bufdata,bb,date;uchar SLA=0xA2,SUBA=0x00;uchar p; /接收指针/uchar keychange=0;uchar key=0; /键盘值/bit keyint=0; /按键中断标志/bit keyok=1; /数据是否修改好/uchar num=0; /移位键移到哪个LED//延时函数/void delayuchar i{whilei--;}// TIMER1 interrupt process //timer0 void interrupt 1 using 1{TH0=0x3c;TL0=0xb0;RESWDI;}void RESWDIvoid ////复位看门狗喂狗{zlg7289_cs=1;CS = 1;CS = 0;CS = 1;zlg7289_cs=1;}void WRENvoid //写使能复位使用{zlg7289_cs=1;SCK=0;CS=0;OUTByte0x06; //发送06H写使能命令字SCK=0;CS=1;zlg7289_cs=1;}void WRDIvoid //写使能复位禁止写{{zlg7289_cs=1;SCK=0;CS=0;OUTByte0x04; //发送04H写禁止命令字SCK=0; CS=1;zlg7289_cs=1;}void WRSRvoid //写状态寄存器{WREN;zlg7289_cs=1;SCK=0;CS=0;OUTByte0x01; //发送01H写寄存器命令字OUTByte0x00; //发送寄存器值BL0,BL1为0没写保护,WD0=0 W01=1 //WD1=0WD1=0看门狗复位时间SCK=0;CS=1;zlg7289_cs=1;WIPCHK; //判断是否写入}unsigned char RSDRvoid //读状态寄存器{unsigned char Temp;zlg7289_cs=1;SCK=0;CS=0;OUTByte0x05; //发送05H读状态寄存器命令字Temp = INPUTByte; //读状态寄存器值SCK=0;CS=1;return Temp;;//这一个调试时没有执行,Temp的值总是0xFF;zlg7289_cs=1;}void WIPCHKvoid //检查WIP位,判断是否写入完成{unsigned char Temp,TempCyc;forTempCyc=0;TempCyc<50;TempCyc++{Temp = RSDR; //读状态寄存器if Temp&0x01==0TempCyc = 50;}}//单字节指令或数据写入X25045//在SI线上输入的数据在SCK的上升沿被锁存;void OUTByteunsigned char Byte //输出一个定节{unsigned char TempCyc;zlg7289_cs=1;forTempCyc=0;TempCyc<8;TempCyc++{SCK = 0;ifByte&0x80SI = 1;elseSI = 0;SCK = 1;Byte = Byte<<1; //右移}SI=0; //使SI处于确定的状态zlg7289_cs=1;}//单字节数据从X25045读到单片机//数据由SCK的下降沿输出到SO线上;unsigned char INPUTBytevoid //输入一个字节{unsigned char Temp=0, TempCyc;zlg7289_cs=1;forTempCyc=0;TempCyc<8;TempCyc++{Temp = Temp<<1; //右移SCK = 1;SCK=0;if SOTemp = Temp|0x01; //SO为1,则最低位为1elseTemp&=0xFE;}return Temp;;//这一个调试时没有执行,Temp的值总是0zlg7289_cs=1;}unsigned char ReadByteunsigned char ADD //读地址中的数据这里不做先导字处理,只能读00-FFH{unsigned char Temp;zlg7289_cs=1;SCK=0;CS=0;SO=1;SI=1;OUTByte0x3; //发送读指令03H 如要支持000-FFF则要把高位地址左移3位再为03H相或OUTByteADD; //发送低位地址Temp = INPUTByte;SCK=0;CS=1;return Temp;//这一个调试时没有执行,Temp的zlg7289_cs=1;}void WriteByteunsigned char Byte,ADD //向地址写入数据这里同样不做先导字处理,只能写00-FFH{WREN;zlg7289_cs=1;SCK=0;CS=0;SO=1;SI=1;OUTByte0x2; //发送写指令02H 如要支持000-FFF则要把高位地址左移2位再为02H相或OUTByteADD; //发送低位地址OUTByteByte; //发送数据SCK=0;CS=1;zlg7289_cs=1;}/模拟I2C总线传输程序/bit ack; /应答标志位//起动总线函数/void Start_I2c{SDA=1; /发送起始条件的数据信号/_Nop;SCL=1;_Nop; /起始条件建立时间大于,延时/_Nop;_Nop;_Nop;_Nop;SDA=0; /发送起始信号/_Nop; / 起始条件锁定时间大于4μs/_Nop;_Nop;_Nop;_Nop;SCL=0; /钳住I2C总线,准备发送或接收数据 / _Nop;_Nop;}/结束总线函数/void Stop_I2c{SDA=0; /发送结束条件的数据信号/_Nop; /发送结束条件的时钟信号/SCL=1; /结束条件建立时间大于4μs/_Nop;_Nop;_Nop;_Nop;SDA=1; /发送I2C总线结束信号/_Nop;_Nop;_Nop;_Nop;}/字节数据传送函数/void SendByteuchar c{uchar BitCnt;forBitCnt=0;BitCnt<8;BitCnt++ /要传送的数据长度为8位/{ifc<<BitCnt&0x80SDA=1; /判断发送位/else SDA=0;_Nop;SCL=1; /置时钟线为高,通知被控器开始接收数据位/ _Nop;_Nop; /保证时钟高电平周期大于4μs/_Nop;_Nop;_Nop;SCL=0;}_Nop;_Nop;SDA=1; /8位发送完后释放数据线,准备接收应答位/_Nop;_Nop;SCL=1;_Nop;_Nop;_Nop;ifSDA==1ack=0;else ack=1; /判断是否接收到应答信号/_Nop;_Nop;}/字节数据接收函数/uchar RcvByte{uchar retc;uchar BitCnt;retc=0;SDA=1; /置数据线为输入方式/forBitCnt=0;BitCnt<8;BitCnt++{_Nop;SCL=0; /置时钟线为低,准备接收数据位/_Nop;_Nop; /时钟低电平周期大于/_Nop;_Nop;_Nop;SCL=1; /置时钟线为高使数据线上数据有效/_Nop;_Nop;retc=retc<<1;ifSDA==1retc=retc+1; /读数据位,接收的数据位放入retc中 / _Nop;_Nop;}SCL=0;_Nop;_Nop;returnretc;}/应答子函数/void Ack_I2cbit a{ifa==0SDA=0; /在此发出应答或非应答信号 /else SDA=1;_Nop;_Nop;_Nop;SCL=1;_Nop;_Nop; /时钟低电平周期大于4μs/_Nop;_Nop;_Nop;SCL=0; /清时钟线,钳住I2C总线以便继续接收/ _Nop;_Nop;}/向有子地址器件发送多字节数据函数/bit ISendStruchar sla,uchar suba,uchar s{uchar i;Start_I2c; /启动总线/SendBytesla; /发送器件地址/ifack==0return0;SendBytesuba; /发送器件子地址/ifack==0return0;fori=0;i<9;i++{SendBytes; /发送数据/ifack==0return0;s++;}Stop_I2c; /结束总线/return1;}/向有子地址器件读取多字节数据函数/bit IRcvStruchar sla,uchar suba,uchar suchar i;Start_I2c; /启动总线/SendBytesla; /发送器件地址/ifack==0return0;SendBytesuba; /发送器件子地址/ ifack==0return0;Start_I2c;SendBytesla+1;ifack==0return0;fori=0;i<8;i++{s=RcvByte; /发送数据/Ack_I2c0; /发送就答位/ s++;}s=RcvByte;Ack_I2c1; /发送非应位/ Stop_I2c; /结束总线/return1;}/模拟I2C程序结束//显示函数/void displayuint dis{uchar j;zlg7289_clk=0;delay20;zlg7289_cs=0;forj=0;j<16;j++{ifdis&0x8000==0x8000 zlg7289_dio=1;else zlg7289_dio=0;delay20;zlg7289_clk=1;delay10;zlg7289_clk=0;delay10;dis=dis<<1;}zlg7289_cs=1;delay20;}void dis_playuchar aa{uchar i;fori=0;i<8;i++{if_crol_aa,i&0x80zlg7289_dio = 1;elsezlg7289_dio = 0;zlg7289_clk = 1;delay10; /延时/zlg7289_clk = 0;}}void displaymonth{bufdata=buf5&0x0f;zlg7289_cs=0;delay10;dis_play0xc8;delay10;dis_playbufdata; /显示日个位/ zlg7289_cs=1;delay70;bufdata=buf5&0x30;bufdata=bufdata>>4;bufdata=bufdata&0x0f;zlg7289_cs=0;delay10;dis_play0xc9;delay10;dis_playbufdata; /显示日十位/ zlg7289_cs=1;delay70;bufdata=buf7&0x0f;zlg7289_cs=0;delay10;dis_play0xca;delay10;dis_playbufdata; /显示月个位/ zlg7289_cs=1;delay70;bufdata=buf7&0x10;bufdata=bufdata>>4;bufdata=bufdata&0x0f;zlg7289_cs=0;delay10;dis_play0xcf;delay10;dis_playbufdata; /显示月十位/ zlg7289_cs=1;delay70;}void displaytime{bufdata=buf3&0x0f;zlg7289_cs=0;delay10;dis_play0xce;delay10;dis_playbufdata; /显示分个位/ zlg7289_cs=1;delay70;bufdata=buf3&0x70;bufdata=bufdata>>4;bufdata=bufdata&0x0f;zlg7289_cs=0;delay10;dis_play0xcd;delay10;dis_playbufdata; /显示分十位/ zlg7289_cs=1;delay70;bufdata=buf4&0x0f;zlg7289_cs=0;delay10;dis_play0xcc;delay10;dis_playbufdata; /显示时个位/ zlg7289_cs=1;delay70;bufdata=buf4&0x30;bufdata=bufdata>>4;bufdata=bufdata&0x0f;zlg7289_cs=0;delay10;dis_play0xcb;delay10;dis_playbufdata; /显示时十位/ zlg7289_cs=1;delay70;}void display_x5045{date=ReadByte0x40;close_date=date;bufdata=date&0x0f;zlg7289_cs=0;delay10;dis_play0xce;delay10;dis_playbufdata; /显示分个位/ zlg7289_cs=1;delay70;bufdata=date&0x70;bufdata=bufdata>>4;bufdata=bufdata&0x0f;zlg7289_cs=0;delay10;dis_play0xcd;delay10;dis_playbufdata; /显示分十位/ zlg7289_cs=1;delay70;date=ReadByte0x42;bufdata=date&0x0f;zlg7289_cs=0;open_date=ReadByte0x42;delay10;dis_play0xcc;delay10;dis_playbufdata; /显示时个位/zlg7289_cs=1;delay70;bufdata=date&0x30;bufdata=bufdata>>4;bufdata=bufdata&0x0f;zlg7289_cs=0;delay10;dis_play0xcb;delay10;dis_playbufdata; /显示时十位/zlg7289_cs=1;delay70;}/按键处理程序///key=47: 闪烁移位键shift//key=39: +//key=39: -//key=31: 确认键okvoid key_int interrupt 0 /键盘中断程序/{keyint=1;}void keyexe{uchar i;uchar temp=0;uchar aa;p06=1;EX0=1;zlg7289_cs = 0;delay10;dis_play0x15; /写入读键盘数据指令/delay10;fori=0;i<8;i++{temp=temp<<1;aa=zlg7289_dio; // 按位或ifaa==1 // 读数据位,接收的数据位放入retc中temp=temp+1;zlg7289_clk=1;delay10; // 延时zlg7289_clk=0;}zlg7289_cs=1;key=temp;ifkey==47 //闪烁移位键{key=0;keyok=0;EX0=0;ifnum==8{num=1;}elsenum++;switchnum{ case 1: {display0x88fe;}break;case 2: {display0x88fd;}break;case 3: {display0x88fb;}break;case 4: {display0x88f7;}break;case 5: {display0x88ef;}break;case 6: {display0x88df;}break;case 7: {display0x88bf;}break;case 8: {display0x887f;}break;default: ;}EX0=1;}else ifkey==39 //+{EX0=0;key=0;RESWDI;ifnum=0{keyok=0;keychange=1;RESWDI;}ifnum==7 //在分个位上{ifbuf3&0x0f==0x09 buf3&=0xf0;else ++buf3;EX0=1;bufdata=buf3&0x0f;zlg7289_cs=0;delay10;dis_play0xce;delay10;dis_playbufdata; /显示分个位/zlg7289_cs=1;delay70;RESWDI;}else ifnum==6 //在分十位上{ifbuf3&0xf0==0x50 buf3&=0x0f;else buf3+=0x10;EX0=1;bufdata=buf3&0x70;bufdata=bufdata>>4;bufdata=bufdata&0x0f;zlg7289_cs=0;delay10;dis_play0xcd;delay10;dis_playbufdata; /显示分十位/zlg7289_cs=1;delay70;RESWDI;}else ifnum==5 //在小时个位上{ifbuf4&0xf0==0x20{ifbuf4&0x0f>0x02 buf4&=0xf0;else ++buf4;}else ifbuf4&0x0f==0x09 buf4&=0xf0;else ++buf4;EX0=1;bufdata=buf4&0x0f;zlg7289_cs=0;delay10;delay10;dis_playbufdata; /显示时个位/zlg7289_cs=1;delay70;RESWDI;}else ifnum==4 //在小时十位上{ifbuf4&0x0f>0x03{ifbuf4&0xf0>0x00 buf4&=0x0f;else buf4+=0x10;}else ifbuf4&0xf0==0x20 buf4&=0x0f;else buf4+=0x10;EX0=1;bufdata=buf4&0x30;bufdata=bufdata>>4;bufdata&=0x0f;zlg7289_cs=0;RESWDI;delay10;dis_play0xcb;delay10;dis_playbufdata; /显示时十位/zlg7289_cs=1;delay70;RESWDI;}else ifnum==1 //在日的个位上{ifbuf5&0xf0==0x30{ifbuf5&0x0f>0x00 buf5&=0xf0;else ++buf5;}else ifbuf5&0x0f==0x09 buf5&=0xf0;else ++buf5;EX0=1;bufdata=buf5&0x0f;RESWDI;zlg7289_cs=0;delay10;delay10;dis_playbufdata; /显示日个位/zlg7289_cs=1;delay70;RESWDI;}else ifnum==2 //在日的十位上{ifbuf5&0x0f>0x01{ifbuf5&0xf0>0x10 buf5&=0x0f;else buf5+=0x10;}else ifbuf5&0xf0==0x30 buf5&=0x0f;else buf5+=0x10;EX0=1;bufdata=buf5&0x30;RESWDI;bufdata=bufdata>>4;bufdata&=0x0f;zlg7289_cs=0;delay10;dis_play0xc9;delay10;dis_playbufdata; /显示日十位/zlg7289_cs=1;delay70;RESWDI;}else ifnum==4 //在月个位上{ifbuf7&0xf0==0x10{ifbuf7&0x0f>0x01 buf7&=0x0f;else ++buf7;}else ifbuf7&0x0f==0x09 buf7&=0xf0;else ++buf7;EX0=1;bufdata=buf7&0x0f;RESWDI;zlg7289_cs=0;delay10;dis_play0xca;delay10;dis_playbufdata; /显示月个位/zlg7289_cs=1;delay70;RESWDI;}else ifnum==8 //在月十位上{ifbuf7&0x0f>0x02{buf7&=0x0f;}else ifbuf7&0xf0==0x10 buf7&=0x0f;else buf7+=0x10;EX0=1;bufdata=buf7&0x10;bufdata=bufdata>>4;bufdata&=0x0f;RESWDI;zlg7289_cs=0;delay10;dis_play0xcf;delay10;dis_playbufdata; /显示月十位/zlg7289_cs=1;delay70;RESWDI;}else ;}else ifkey==15 //存放断电时间,数据存放于5045中,每按键数据减少一{display_x5045;EX0=1;key=0;ifnum=0{keyok=0;keychange=1;}ifnum==7 //在分个位上{date=ReadByte0x40;ifdate&0x0f==0x00 date|=0x09;else --date;EX0=1;bufdata=date&0x0f;zlg7289_cs=0;delay10;dis_play0xce;delay10;dis_playbufdata; /显示分个位/zlg7289_cs=1;delay70;WriteBytedate,0x40;}else ifnum==6 //在分十位上{date=ReadByte0x40;ifdate&0xf0==0x00 date|=0x50;else date-=0x10;EX0=1;bufdata=date&0x70;bufdata=bufdata>>4;bufdata&=0x0f;zlg7289_cs=0;delay10;dis_play0xcd;delay10;dis_playbufdata; /显示分十位/zlg7289_cs=1;delay70;WriteBytedate,0x40;}else ifnum==5 //在小时个位上{date=ReadByte0x42;ifdate&0xf0==0x20{ifdate&0x0f==0x00||date&0x0f>0x03 date|=0x03;else --date;}else ifdate&0x0f==0x00 date|=0x09;else --date;EX0=1;bufdata=date&0x0f;zlg7289_cs=0;delay10;dis_play0xcc;delay10;dis_playbufdata; /显示时个位/zlg7289_cs=1;delay70;WriteBytedate,0x42;}else ifnum==4 //在小时十位上{date=ReadByte0x42;ifdate&0x0f>0x03{ifdate&0xf0==0x00 date|=0x10;else date-=0x10;}else ifdate&0xf0==0x00 date|=0x20;else date-=0x10;EX0=1;bufdata=date&0x30;bufdata=bufdata>>4;bufdata&=0x0f;zlg7289_cs=0;delay10;dis_play0xcb;delay10;dis_playbufdata; /显示时十位/zlg7289_cs=1;delay70;WriteBytedate,0x42;}else ifnum==1 //在日的个位上{ifbuf5&0xf0==0x30{ifbuf5&0x0f==0x00||buf5&0x0f>0x01 buf5|=0x01;else --buf5;}else ifbuf5&0x0f==0x00 buf5|=0x09;else --buf5;bufdata=buf5&0x0f;zlg7289_cs=0;delay10;dis_play0xc8;delay10;dis_playbufdata; /显示日个位/zlg7289_cs=1;delay70;}else ifnum==2 //在日的十位上{ifbuf5&0x0f>0x01{ifbuf5&0xf0==0x00 buf5|=0x20;else buf5-=0x10;}else ifbuf5&0xf0==0x00 buf5|=0x30;else buf5-=0x10;bufdata=buf5&0x30;bufdata=bufdata>>4;bufdata&=0x0f;zlg7289_cs=0;delay10;dis_play0xc9;delay10;dis_playbufdata; /显示日十位/zlg7289_cs=1;delay70;}else ifnum==3 //在月个位上{ifbuf7&0xf0==0x10{ifbuf7&0x0f==0x00||buf7&0x0f>0x01 buf7|=0x01;else --buf7;}else ifbuf7&0x0f==0x00 buf7|=0x09;else --buf7;bufdata=buf7&0x0f;zlg7289_cs=0;delay10;dis_play0xca;delay10;dis_playbufdata; /显示月个位/zlg7289_cs=1;delay70;}else ifnum==8 //在月十位上{ifbuf7&0x0f>0x02 buf7&=0x0f;else ifbuf7&0xf0==0x00 buf7|=0x10;else buf7-=0x10;bufdata=buf7&0x10;bufdata=bufdata>>4;bufdata&=0x0f;zlg7289_cs=0;delay10;dis_play0xcf;delay10;dis_playbufdata; /显示月十位/zlg7289_cs=1;delay70;EX0=1;}else ;}else ifkey==31 //ok{EX0=0;key=0;keyok=1;num=0;ifkeychange==1{keychange=0;p=buf;SUBA=0x00;buf0=0x00;buf1=0x00;buf2=0x00;ISendStrSLA,SUBA,p;for i=0;i<250;i++delay250;}else ;zlg7289_cs=0;delay10;dis_play0x88;delay10;dis_play0xff; /清LED闪烁/zlg7289_cs=1;delay70;}EX0=1;}/主函数//void main{unsigned char i,j,word2;/程序的初始化/TMOD=0x09;TH0=0x3c;TL0=0xb0;TR0=1;ET0=1;IP=0x02; //中断优先级敲定IT0=1;EX0=1;IE0=1;EA=1; /打开全部中断/p10=1;p06=1;p07=1;WREN;WRSR;WRDI;WriteByte0x07,0x40;//在0x20中写入0x10, 为了验证WriteByte0x0a,0x42;WRDI;word2=ReadByte0x22;/初始化结束//清LED显示/zlg7289_cs=0;delay10;dis_play0xA4; //复位zlg7289_cs=1;delay70;/给时钟芯片附初值/Stop_I2c;EX0=0;p=buf;SUBA=0x00;buf0=0x00;buf1=0x00;forj=0;j<8;j++{fori=0;i<250;i++delay250;}ISendStrSLA,SUBA,p;delay100;EX0=1;while1{ifkeyint==1{EX0=1;ET0=1;keyexe;ifkeychange==0{keyint=0;ET0=1;}for i=0;i<250;i++delay250;EX0=1;}ifkeyok==1&&keychange==0&&keyint==0 {EX0=0;p=buf;SUBA=0x00;IRcvStrSLA,SUBA,p;for i=0;i<250;i++delay25;buf3&=0x7f;buf4&=0x3f;buf5&=0x3f;buf7&=0x1f;displaymonth;displaytime;EX0=1;}ifbuf4>=close_date||buf4<=open_date p10=0;for i=0;i<250;i++delay25;}}。
C语言课程设计万年历打印(20191225204701)
void thirdFun( int year , int month , int day ); // 第三功能
各程序流程图如下:
4
firstFun() 函数 开始
判断是否打印了 6
是
和 12 月份的日历
否 打印某月日历
结束
图 2.1 程序流程图(一)
secondFun() 函数 开始
判断是否月末的
打印某年某月
提示信息
日历模块
计算距今天数和 判断节日模块
图 1.2 功能模块图
3
2 详细设计
2.1 数据结构
建立日历信息结构体,结构体成员变量包括月末、月初星期几、屏幕信息左半边日历是 否打印完毕。
typedef struct calendar {
int month_end; int first_day;
1.1 需求分析 ............................................................................................................................2.... 1.2 功能流程图 .........................................................................................................................2... 1.3 功能模块图 .........................................................................................................................3... 2 详细设计 .......................................................................................................................................4.... 2.1 数据结构 ............................................................................................................................4.... 2.2 函数功能设计 .....................................................................................................................4... 3 调试分析 .......................................................................................................................................7.... 3.1 程序测试 ............................................................................................................................7.... 3.2 程序缺陷 ............................................................................................................................9... 4 总结与体会 .................................................................................................................................1..0.. 参考文献 ........................................................................................................................................1..1.. 附录 ................................................................................................................................................1..2..
C语言课程设计--万年历
C 语言课程设计报告设计题目:万年历学生姓名:学生学号:专业班级:数学与应用数学一班学院名称:数学与计量经济学院同组人姓名:指导老师:2011年6月15 日1 需求分析1.1问题描述我们需要实现万年历的功能,那么如何实现这个功能呢?我们都很清楚,普通年份和闰年是有区别的,那么该怎么区分这种一天的差别对于万年历日期现实的影响呢?而且已知一个日期,那么我们怎么能够知道它是星期几?是不是需要一个参照物来比较呢?而且还有很多关于万年历的美化问题,占位符的考虑等等。
另外我们还必须判断输入的万年历是否合法,这也需要一个子函数来实现。
好吧,至于基础的判断闰年也是不在话下了。
1.2输入数据要求我们要考虑三种情况,这三种情况下是不能够实现这个万年历的功能的:/*如果给定的日期中年份部分为非正数*/if(date.year<=0)printf("年份不符合要求!\n"printf("请重新输入)/*如果给定的日期中月份部分为负数,为0或者大于12*/if(date.month>12||date.month<1)printf("月份不符合要求!\n");printf("请重新输入");getchar();exit(0);/*如果给定的日期中天数部分为非正数,或者大于31*/a[2]=28+leap(date.year);if(date.day>a[date.month]||date.day<1)printf("日期不符合要求!\n");printf("请重新输入");getchar();exit(0);1.3输出数据要求根据输入数据,输出数据必须严格的按照占位符进行逻辑的策划,然后得知一行万年历的日期的占位符是38个占位符,于是空格占位符和字符显示出来的那些占位符就需要有一个限定使得其不凌乱特别应该注意空格符的占位。
C语言课程设计 万年历
计算机基础课程设计C语言设计报告题目:万年历学院:电气与电子工程学院专业:自动化班级:070304姓名:于洋指导教师:周丽娟设计日期:一、设计题目及来源万年历,来自网上搜索。
二、功能isLeap()判断输入数据是否是闰年;maxDay()判断某年某月最多天数;eachYearTotal ()判断这一天是该年的第几天;week判断某年某月某日的编号;output()输出该天星期几;display()显示月历;check()检查有效性;display1()输出年历;display2()输出月历;display3()输出日历;getMenu()调菜单;三、流程图#include<stdio.h>#include<stdlib.h>int isLeap(int year);int maxDay(int year,int month);int eachYearTotal(int year,int month,int day); int week(int year,int month,int day);char *chineseWeek(int number);void output(int year,int month,int day);void display(int year,int month);int check(int year,int month,int day);void display1(int year);void display2(int year,int month);void display3(int year,int month,int day); void getMenu();void main(){int year,month,day,flag,select;while(1){getMenu();printf("shu ru xuan ze: ");fflush(stdin);scanf("%d",&select);fflush(stdin);switch(select){case 1:do{printf("shu ru nian: ");scanf("%d",&year);flag=check(year,1,1);if(flag==0){printf("shu ru wu xiao\n");}}while(flag==0);display1(year);break;case 2:do{printf("shu ru nian yue: ");scanf("%d%d",&year,&month);flag=check(year,month,1);if(flag==0){printf("shu ru wu xiao\n");}}while(flag==0);display2(year,month);break;case 3:do{printf("shu ru nian yue ri: ");scanf("%d%d%d",&year,&month,&day);flag=check(year,month,day);if(flag==0){printf("shu ru wu xiao\n");}}while(flag==0);display3(year,month,day);break;case 4:exit(0);default:printf("shu ru you wu!\n\n");}}}int isLeap(int year){if(year%4==0&&year%100!=0||year%400==0) return 1;elsereturn 0;}int maxDay(int year,int month){int a[]={31,28,31,30,31,30,31,31,30,31,30,31};if(isLeap(year))a[1]=29;return a[month-1];}int eachYearTotal(int year,int month,int day){int i,sum=0;for(i=1;i<month;i++){sum+=maxDay(year,i);}sum+=day;return sum;}int week(int year,int month,int day){intnumber=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+eachYearTotal(year,month,d ay);number%=7;return number;}char *chineseWeek(int number){switch(number){case 0:return "Sunday";case 1:return "Monday";case 2:return "Tuesday";case 3:return "Wednesday";case 4:return "Thursday";case 5:return "Friday";case 6:return "Saturday";default:return "error";}}void output(int year,int month,int day){int number=week(year,month,day);printf(" gong yuan%d nian%d ue%d ri%10s\n\n",year,month,day,chineseWeek(number)); }void display(int year,int month){int max,number,i,j=1;max=maxDay(year,month);number=week(year,month,1);printf("%4s%4s%4s%4s%4s%4s%4s\n"," Sunday "," Monday "," Tuesday "," Wednesday "," Thursday "," Friday "," Saturday ");for(i=0;i<number;i++){printf(" ");}while(j<=max){printf("%4d",j);if(i%7==6){printf("\n");}i++;j++;}printf("\n\n");}int check(int year,int month,int day){if(year<0||month<1||month>12||day<1||day>maxDay(year,month))return 0;elsereturn 1;}void display1(int year){int i;printf("\n");for(i=1;i<=12;i++){printf(" gongyuan%d nian%d yue\n\n",year,i); display(year,i);}}void display2(int year,int month){printf("\n gongyuan%d nian%d yue\n\n",year,month); display(year,month);}void display3(int year,int month,int day){printf("\n");output(year,month,day);display(year,month);}void getMenu(){printf("1.nianli\t2.yueli\t3.rili\t4.tuiqu\n");}。
C语言课程设计万年历 完整版
目录一引言 (2)二系统功能和数据说明 (3)一)功能简介 (3)二)程序中的数据说明 (3)三程序总体设计及流程图 (4)一)应用到的c语言 (4)二)程序的总框架 (5)四功能模块设计及调试 (5)一)算法说明 (5)1.总天数的算法 (5)2.计算输入日期是星期几 (6)3.对输入信息的汇总 (8)4..界面的控制 (10)二)调试结果 (11)五程序清单 (12)六结束语 (17)一引言通过大一上学期对C语言的学习,了解到了很多C语言的相关知识。
学习的过程有很多困惑但是当自己能够独立的看懂,能过独立的完成一个简单的程序时,心中就会收获无限的喜悦和成就感。
我可以里哟哦那个它看懂一些简单的程序,编写一些简单的计算程序,更多的是学会了一种思想——编程,它让我在去思考很多日常生活中的事物是怎么样通过一个个小小的函数实现功能的,激发我对探究的兴趣。
C语言是近年在国内外得到迅速推广应用的一种语言。
C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。
因此,C语言特别适合于编写各种软件。
在这次的课程设计中我将把日常生活中最经常接触的——日期的查询利用C语言的程序编成一个简单的日历。
通过这个小小的日历可以实现很多功能。
在程序中你能看到很多熟悉的C语言关键字,同时也加入了很多自己课外了解到的一些关键字。
在不断的调试中最终才获得最为完整的程序。
接下来就是我的C 语言课程设计的具体内容来了二系统功能和数据说明(一)功能简介在我们的日常生活中能接触到很多不同类型的日历,在日历上我们通常希望它能简介明了的给我们最想要的日期信息。
在我的万年历当中,就是将日历,月历做的简单明了,很方便我们的使用。
下面是它要实现的一些基本功能:用C语言编写万年历1、输入年份,判断是否为闰年2、输入年月日,判断改日为星期几3、输入年份,打出12个月历,输入月份,打出该月的日历4、要求用多个函数实现[名称]万年历[修改]1、对输入的日期进行容错处理2、增加和修改为英文的月份和星期显示3、采用指针形式的weeks和month数组(二)程序中的数据说明①int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};这是定义的关于每个月天数的数组,根据大小月以及二月分的特殊情况将每个月的天数最为数组中的元素存入数组当中。
c万年历课程设计
c万年历课程设计一、课程目标知识目标:1. 学生能理解万年历的基本概念,掌握年、月、日的关系及其换算方法。
2. 学生能运用所学的数学知识,编写简单的万年历程序,计算任意日期是星期几。
3. 学生了解历法的起源和发展,理解我国农历与公历的区别和联系。
技能目标:1. 学生通过编写万年历程序,提高编程能力和逻辑思维能力。
2. 学生能够运用万年历知识解决实际问题,如计算节日日期、安排活动等。
3. 学生学会查阅相关资料,培养自主学习能力和合作精神。
情感态度价值观目标:1. 学生对万年历产生兴趣,激发学习数学和编程的热情。
2. 学生通过了解历法的发展,增强对传统文化的认识,培养民族自豪感。
3. 学生在合作学习中,学会尊重他人,培养团队协作意识。
本课程旨在结合学生年级特点,以提高学生的数学应用能力和编程技能为核心,通过万年历的学习,使学生在掌握知识的同时,培养良好的学习态度和价值观。
课程目标具体、可衡量,为教学设计和评估提供明确方向。
二、教学内容1. 万年历的基本概念:年、月、日的关系,闰年的判断方法,星期计算。
2. 编写万年历程序:流程图设计,算法实现,调试与优化。
3. 历法的起源与发展:古代历法,农历与公历的转换,二十四节气。
4. 实践应用:计算特定日期的星期,安排节日活动,了解历史上的今天。
教学大纲:第一课时:万年历的基本概念,闰年的判断方法,星期计算。
第二课时:编写万年历程序,学习流程图设计,实现基本算法。
第三课时:历法的起源与发展,了解农历与公历的转换,学习二十四节气。
第四课时:实践应用,解决实际问题,如计算节日日期,了解历史上的今天。
教学内容依据课程目标,结合课本章节,保证科学性和系统性。
通过以上安排,使学生掌握万年历相关知识,提高编程技能,并培养对传统文化的认识。
三、教学方法本课程采用以下多样化的教学方法,旨在激发学生的学习兴趣,提高主动性和参与度:1. 讲授法:教师通过生动的语言和形象的比喻,讲解万年历的基本概念、历法的发展和算法原理,为学生奠定坚实的理论基础。
用c语言编写万年历程序
序言我们经过了一个学期的c语言课程的学习,对计算机变成所需的c语言有了大体的了解,能够看懂和编写一些简单的c语言程序,为了更好的加深同学们对c语言的认识,提升同学们的c语言时间编程能力,所以进行了c语言的课程设计。
本程序是一个万年历程序,可以在程序中任意的输入公元年份,通过程序的将该年份的各种信息形象直观的显示出来,达到c语言程序编写所体现的方便快捷的功效。
同时,通过对该程序c语言的编写,能够在训炼我们在课本中学到各种知识点,并将其应用其中。
设计题目:1设计编写一个C程序—“万年历”。
2输入任一年将显示出该年的所有月份日期,对应的星期。
3 下一行显示星期,从周日到周六,中英文都可以。
4 下一行开始显示日期从1号开始,并按其是周几实际情况与上面的星期数垂直对齐。
5 月份:中文英文都可以,注意闰年情况。
问题定义(或系统分析):1 要输入任一年显示出该年的所有月份日期,应该先设计具体的输出格式,如下:the calendar of the year2008.JanuarySun Mon Tue Wed Thu Fri Sat1 2 3 4 56 7 8 9 10 11 1213 14 15 16 17 18 1920 21 22 23 24 25 2627 28 29 30 31FebruarySun Mon Tue Wed Thu Fri Sat1 23 4 5 6 7 8 910 11 12 13 14 15 1617 18 19 20 21 22 2324 25 26 27 28 29=============================================…………2 判断是不是闰年(year%4!=0||year%100==0&&year%400!=0)满足条件就是平年,把一年中的所有月份分为四类(28,29,30,31)。
3 求出一年中的第一天是周几(year +(year-1)/4-(year-1)/100+(year-1)/400)%7。
课程设计用C语言设计一个年历系统
{
if( year % 4 != 0 || year % 100 == 0 && year % 400 != 0 ) //判断闰
年,真为平年
return( 2 );
else return( 3 );
}
else return( 4 );
}
void calendar()
{
int year, i, j, a, n, m, k, line; //定义变量
{
memset( tempOut, 0, sizeof( tempOut ) );//memset 函数的作用是在
一段内存块中填充某个给定的值,它是对数组进行清零操作
printf( "%-33s%s\n", month[i], month[i + 1] ); //输出月份名,-33
是先左对齐再留 33 个空格
for( m = 1; m < 32; m++ )//每月天数循环 {
sprintf( temp, "%4d", m ); //输出格式占 4 列,右端对齐 strcat( tempOut[ i % 2 ][ line ], temp );//运用 strcat 函数 把 temp 数组拷贝到 tempout 所指的末尾,且 tempout 有足够的空间存放 temp 的内容 if( ( a + m ) % 7 == 0 ) line ++; if( n == 1 && m == 31 ) break; //从此处至以下执行整月停止 else if( n == 2 && m == 28 ) break; else if( n == 3 && m == 29 ) break; else if( n == 4 && m == 30 ) break; } a = ( a + m ) % 7; // a 为每月末行天数
c语言课程设计报告万年历最详细
c语言课程设计报告万年历最详细集团文件发布号:(9816-UATWW-MWUB-WUNN-INNUL-DQQTY-C语言课程设计报告-----万年历设计人:贾伟涛学号:12班级:13电信应电班指导老师:张伟日期:2014年6月9日内容提要通过大一下学期对C语言的学习,了解到了很多C语言的相关知识。
学习的过程虽然有很多困惑,但是当自己能够独立的看懂和独立的完成一个简单的程序时,心中就会收获无限的喜悦和成就感。
我虽然可以看懂一些简单的程序,编写一些简单的计算程序,更多的是学会了一种思想——编程,它让我在去思考很多日常生活中的事物是怎么样通过一个个小小的函数实现功能的,激发我对c语言的兴趣。
C语言是近年在国内外得到迅速推广应用的一种机器语言。
C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。
因此,C语言特别适合于编写各种软件。
在这次的课程设计中我将把日常生活中最经常接触的——日历的查询,利用C 语言的程序编成一个简单的万年历查询系统。
通过这个小小的系统可以实现很多功能。
在程序中你能看到很多熟悉的C语言关键字,同时也加入了很多自己课外了解到的一些关键字。
在不断的调试中最终才获得最为完整的程序。
接下来就是我的C 语言课程设计的具体内容来了,大家拭目以待吧!目录一、系统功能和数据说明-----------------------二、问题分析---------------------------------三、程序总体设计及功能结构框图---------------四、程序流程图-------------------------------五、源程序代码-------------------------------六、使用说明---------------------------------七、个人心得---------------------------------八、参考文献---------------------------------一、系统功能和数据说明(一)功能简介在日常生活中能接触到很多不同类型的日历,在日历上我们通常希望它能简单明了的给我们最想要的日期信息。
c语言课程设计万年历范例
C语言课程设计计算机科学与技术专业****班学号:******姓名:******目录序言 (1)说明 (2)流程图 (3)源代码 (4)小结 (5)序言1. 经过上一个学期对《C程序设计》的学习,同学们都认为真正的学到了有用知识,可能有一些人学的不够理想,但无论如何,这些知识都为我们的下一步学习打下了坚实的基础。
做这么一个课程设计,一方面是为了检查我们一个学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强。
本程序是一个万年历程序,可以输出公元一年一月以后任意月份的天数及每一天是星期几,只要在运行程序时按照要求输入年份再输入和月份,程序就会把这一月份的日历显示在屏幕上,使人一目了然。
该程序能与目前天文学研究中所采用的各种日历程序所能计算的范围相一致。
2 . 课程设计题目:万年历要求:输入年份和月份,自动输出该月的日历,清楚的显示每一天是星期几。
指导老师:翟海霞说明一.算法分析说明:1. 总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为355。
然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。
2. 输出月份第一天为星期几的算法:使总天数除以7取余加2得几既为星期几,若是7,则为星期日。
3. 算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。
二.要用到的函数和语句1.<stdio.h>,<conio.h>,<math.h> /*头文件*/2.main() /*主函数*/3.printf(),4.scanf()5.textbackground(),textcolor() /*定义背景和字体颜色*/6.if 语句7.for 语句8.printstar() /*调用函数*/9.int day_year() /*定义函数*/10.goto /*循环语句*/流程图1.图一输入的年份判断从定义年到输入的年份中每个年份是否为闰年是否每年为366天每年为365天返回该年的天数2.图二输入的年月判断输入年是否为定义年是否总天数S=1 总天数S为定义年到输入年的总天数把S加上该年一月到输入月份的天数,再加1判断输入的月份是否为闰年中的月份是否该月是否大于二月是否把S加上该年一月到输入月份的天数把S再加上该把S加上该年年一月到输入一月到输入月的月份的天数份的天数再加1总天数为S判断S的最后一天为星期几从这一天起依次输出输入月份的天数直到该月底为止源代码#include<conio.h>#include<stdio.h>#include <math.h>main(){long s=1;int a[14]={0,0,31,28,31,30,31,30,31,31,30,31,30,31}; int y,m,p,i,j,k,n,leap;int day_year(int y);textbackground(RED);textcolor(YELLOW);clrscr();printf("please input the year:");scanf("%d",&y);printf("\n");printf("please input the month:");scanf("%d",&m);printf("\n");textbackground(3);clrscr();printf("\tYear:%d Month:%d\n",y,m);printf("\n");if(y==1)s=1;for(i=1;i<y;i++)s=s+day_year(y-1);if(y%4==0&&y%100!=0||y%400==0)leap=1;else leap=0;for(i=0;i<=m;i++)s=s+a[i];if(leap==1&&m>2)s=s+1;else s=s+0;p=s%7+3;printf(" Sun Mon Tue Wed Thu Fri Sat\n"); printstar();if(p<=7)n=4*(p-1);else n=4*(p-8);for(j=1;j<=n;j++)printf(" ");if(leap==1&&m==2)a[3]=a[3]+1;else a[3]=a[3]+0;for(j=1;j<=a[m+1];j++){printf("%4d",j);if((j+n/4)%7==0)printf("\n");}printf("\n");printstar();printstar();s=1;printf("do you want contintue(y/n)");scanf("%c",&q);for(;;){int k;k=bioskey(0);if(k==0x316e) break;if(k==0x1579) goto loop;}}printstar(){printf("******************************\n"); }int day_year(int y){if(y%4==0&&y%100!=0||y%400==0)return(366);else return(365);}小结经历了这次课程设计的设计和制作的整个过程,我才发现我知识的贫乏和知识面的狭窄,原本以为不就是一个小小的课程设计,小case,很容易就可以搞定,可是到了后来实际的操作的时候可是花费了我九牛二虎之力,不说其他的,只说时间上面,我在宿舍里面熬了三个通宵,更不用说白天的时间了。
C语言编写方案 万年历
结束 图 6-2 系统流程图
第 3 页 共 22 页
《C 语言程序设计》课程综合案例
}Lunar_ipedef struct {
int era_year; //阳历年份 int era_month; //阳历月份 int era_day; //阳历日期 }Chinese_era;
int get_lunar_info(int solar_year, int solar_month, Lunar_info *l_info,Chinese_era *china_era):返回农历信
息;
第 2 页 共 22 页
《C 语言程序设计》课程综合案例
int out_chinese(Lunar_info *l_info,char *chinese_str):输出农历日期信息; void sub_menue():界面输出。
"小寒","大寒","立春","雨水","惊蛰","春分", "清明","谷雨","立夏","小满","芒种","夏至", "小暑","大暑","立秋","处暑","白露","秋分", "寒露","霜降","立冬","小雪","大雪","冬至" }; /*农历日*/ char chinese_day[30][5]= { "初一","初二","初三","初四","初五","初六","初七",
《C语言程序设计》课程设计--年历显示
南京航空航天大学金城学院《C语言程序设计》课程设计实验报告题目: _ 年历显示班级:学号:姓名:成绩:指导教师:完成日期:年月日目录一、程序的主要功能二、系统总框架图三、各模块的功能四、功能模块图五、程序结构流程图六、试验结果七、编程体会八、参考资料九、附录:程序清单及源程序一、程序的主要功能(1)可根据菜单进行日历显示(2)输入年月日显示当天星期几,是否为公历节日(3)自动获取系统当前日期,与输入日期比较(4)输入年月日,显示距今多少天二、系统总框架图三、各模块的功能int total (int yeara) //计算公元一年一月一日到输入年份之前的总天数int where (int yearb,int monb) //判断每月天数void when (int day) //判断输入日期是星期几void why(int month,int day) //公历节日判断void output_year() //年份输出void output_month() //年月输出void output_day() //年月日输出int main () //主函数四、功能模块图五、程序结构流程图六、试验结果七、编程体会刚开始没有想到去怎么做,查找资料知道了公元一年一月一日是星期一的切入点,然后事情就变得简单了。
还有就是在主函数中利用do while实现功能的循环。
最麻烦的是系统当前时间的获取,通过百度的查找,懂得了用tm 时间结构。
这次课设让我对c语言有了更深的认识八、参考资料(1)chinaunix博客(2)比特网(3)百度文库九、附录:程序清单及源程序#include <stdio.h>#include <time.h>int total (int yeara) //计算公元一年一月一日到输入年份之前的总天数{int i,s=0,a;for (i=1;i<=yeara-1;i++){if (i%4==0 && i%100!=0 || i%400==0)a=366;elsea=365;s=s+a;}return s;}int where (int yearb,int monb) //判断每月天数{int tian;switch (monb){case 1: tian=31;break;case 2:if(yearb%4==0 && yearb%100!=0 || yearb%400==0)tian=29;elsetian=28;break;case 3: tian=31;break;case 4: tian=30;break;case 5: tian=31;break;case 6: tian=30;break;case 7: tian=31;break;case 8: tian=31;break;case 9: tian=30;break;case 10: tian=31;break;case 11: tian=30;break;case 12: tian=31;break;}return tian;}void when (int day) //判断输入日期是星期几{switch(day){case 1: printf("该日为星期一\n");break;case 2: printf("该日为星期二\n");break;case 3: printf("该日为星期三\n");break;case 4: printf("该日为星期四\n");break;case 5: printf("该日为星期五\n");break;case 6: printf("该日为星期六\n");break;case 7: printf("该日为星期日\n");break;}}void why(int month,int day) //公历节日判断{if(month==1)if(day==1)printf("该日是元旦\n");elseprintf("该日不是公历节日!\n");if(month==3){switch(day){case 8: printf("该日是国际妇女节\n"); break;case 12: printf("该日是植树节\n"); break;default : printf("该日不是公历节日!\n"); break;}}if(month==4)if(day==5)printf("该日是清明节\n");elseprintf("该日不是公历节日!\n");if(month==5){switch(day){case 1: printf("该日是劳动节\n"); break;case 4: printf("该日是五四青年节\n"); break;default : printf("该日不是公历节日!\n"); break;}}if(month==6)if(day==1)printf("该日是儿童节\n");elseprintf("该日不是公历节日!\n");if(month==7)if(day==1)printf("该日是中国建党节\n");elseprintf("该日不是公历节日!\n");if(month==8)if(day==1)printf("该日是建军节\n");elseprintf("该日不是公历节日!\n");if(month==9){switch(day){case 3: printf("该日是抗日战争胜利纪念日\n"); break;case 10: printf("该日是教师节\n");break;default : printf("该日不是公历节日!\n"); break;}}if(month==10)if(day==1)printf("该日是国庆节\n");elseprintf("该日不是公历节日!\n");}void output_year() //年份输出{int year,d,di,did,z,j;printf("请输入年份(eg:2015):");scanf("%d",&year);z=total(year);for (j=1;j<=12;j++){d=z%7;printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");printf (" %d月份\n",j);printf ("sun mon tue wed thu fri sat\n");if (d<6)for (di=1;di<=d+1;di++)printf(" ");for (did=1;did<=where(year,j);did++){printf ("%d",did);if (did<10)printf (" ");elseprintf (" ");if (did==6-d || (did-6+d)%7==0 || did==where(year,j))printf ("\n");}z=z+where(year,j);}main();}void output_month() //年月输出{int year,m,n,d,di,did,j,Z,D;printf ("请输入所查日历的年月(eg:2015 01):");scanf ("%d%d",&m,&n);Z=total(m);for (j=1;j<=n-1;j++){D=where(m,j);Z=Z+D;}d=Z%7;printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");printf (" %d月份\n",n);printf ("sun mon tue wed thu fri sat\n");if (d<6)for (di=1;di<=d+1;di++)printf(" ");for (did=1;did<=where(m,n);did++){printf ("%d",did);if (did<10)printf (" ");elseprintf (" ");if (did==6-d || (did-6+d)%7==0 || did==where(m,n))printf ("\n");}main();}void output_day() //年月日输出{int d,h,j,k,l,x,y,z,Z,Z1,D,jian,judge;time_t timep;struct tm *p;time(&timep); //系统时间获取p =localtime(&timep); //此函数获得的tm结构体的时间,是已经进行过时区转化为本地时间printf ("请输入年月日(eg:2015 01 01):");scanf ("%d%d%d",&x,&y,&z);judge=where(x,y);if(judge<z || y>12)printf("输入日期不存在!");else{Z=total(x);for (j=1;j<=y-1;j++){D=where(x,j);Z=Z+D;}Z=Z+z;h=1900+p->tm_year;//时间赋值k=1+p->tm_mon;l=1+p->tm_mday;Z1=total(h);for (j=1;j<=k-1;j++){D=where(k,j);Z1=Z1+D;}Z1=Z1+l;jian=Z1-Z;printf ("输入日期距今有%d天\n",jian);d=Z%7;when(d);why(y,z);}main();}int main (){int number;printf("\n\n*************查询方式************* \n");printf("* 1.查询某年的日历 * \n");printf("* 2.查询某月的日历 * \n");printf("* 3.查询特定的日期 * \n");printf("* 4.查询结束--退出 * \n");printf("********************************** \n");do{printf("请输入查询方式:");scanf("%d",&number);switch(number){case 1: output_year(); break;case 2: output_month(); break;case 3: output_day(); break;case 4: break;default : printf("输入错误!\n--------------\n");break;}}while (number!=1 && number!=2 && number!=3 && number!=4);}。
C语言程序设计,万年历
C语言程序设计*万年历HPU chang目录:1.设计任务书1.1题目与要求1.2本系统涉及的知识点2.功能设计:2.1算法设计2.2 部分模块流程图3.程序代码设计3.1输入模块3.2输出模块4.程序设计总结:5.致谢;6.参考文献:7.附:程序1设计任务书:1.1题目与要求本人计划编写一个万年历系统,用来查询任意一天的星期、任意年月的月历、任意年年历。
具体要求如下:(1)当输入数字“1”时,显示“请输入年月日(XXXX,XX,XX)”运行后输出:XXXX 年XX月XX日是星期X,是否继续查询(Y/N)?如果输入Y,则重新显示“请输入年月日(XXXX,XX,XX)”,否则回到主菜单.(2)在主菜单中输入2后,显示:“请输入要打印的月份(XXXX)”运行后输出X月的日历,格式为:XXXX年XX月S M T W T F SX X X X X X XX X X X X X XX X X X X X XX X X X X X XX X运行完成后显示:“是否继续打印(Y/N)?” 如果输入Y,则重新显示“请输入要打印的月份(XXXX年XX月)”,否则回到主菜单。
(3)在主菜单中输入3后,显示:“请输入要打印的年份(XXXX)”运行后输出XXXX年的日历,XXXXX(月数)S M T W T F SX X X X X X XX X X X X X XX X X X X X XX X X X X X Xx x……S M T W T F SX X X X XX X X X X X XX X X X X X XX X X X X X XX X X X X运行完成后显示:“是否继续打印(Y/N)?” 如果输入Y,则重新显示“请输入要打印的年份(XXXX)”,否则回到主菜单。
(4)在主菜单中输入4后,显示:“是否要真的退出(Y/N)?” 如果输入Y,结束程序运行,否则重新显示主菜单。
1.2本系统涉及的知识点本系统涉及的知识点有: for语句、do-while语句、switch语句、break语句、if-else 语句、还有sizeof、return 、default、char、printf 、scanf 等,包含了课本上的很多知识。
C++课程设计--万年历
C++课程设计--万年历安徽省巢湖学院计算机与信息工程学院课程设计报告课程名称《C++语言》课题名称万年历设计专业计算机科学与技术班级#**************学号000000000姓名非凡方法指导教师vdnggb目录1、设计题目•••••••••••••••••••••• 12、设计要求•••••••••••••••••••••• 13、总体设计•••••••••••••••••••••• 13.1 系统功能框架••••••••••••••••• 13.2 系统功能说明••••••••••••••••• 24、详细设计•••••••••••••••••••••• 24.1 数据结构设计••••••••••••••••• 24.2 程序详细源代码••••••••••••••• 35、运行结果•••••••••••••••••••••• 81、设计题目:万年历设计2、设计要求:(1)程序运行时,首先给出3个菜单选项的内容和输入提示:1 显示一年的日历2 显示某一天是星期几0 退出(2)用户可以通过主菜单选择不同的选项。
若选择1,则通过输入年份,显示输出该年每个月的日历。
若选择2,则通过输入日期,查询这一天是星期几。
3、总体设计:3.1系统功能框架(流程图)依据课程设计的要求,需要设计一个菜单功能,进入程序后,有菜单可以提供选择,选择1,进入日期显示阶段,日期显示完毕,再次进入菜单选择。
选择2,进入日期查询阶段,日期查询完毕,再次进入菜单。
选择0,退出程序。
3.2系统功能说明(功能板块)在菜单要求当中,要求能够按年查询,能够查询某天是星期几。
然而,在程序当中为了实现这两个功能,包括了闰年的判断,日期判断,日期打印和日期的查询。
功能是由它们共同实现的。
4、详细设计4.1 数据结构设计本程序采用类定义代码如下:class Date{private:int year;public:int weekday();void disp(int x);int isleapyear();int monthday(int i);void getyear();};类名:Date数据成员:year成员函数:void getyear();//输入年份的函数int isleapyear();//判断是否是闰年的函数int weekday();//判断本月第一天是星期几的函数int monthday(int i);// 计算每月有几天的函数void disp(int x); //输出月份及查询年份的月历的函数及字符串数组定义代码如下:char*weekd[7]={"MON","TUE","WEN","THU","FRI","STA","SUN"};4.2 程序详细源代码#include<iostream.h>#include<iomanip.h>void f1();void f2();int judgeyear(int);int monthdays(int ,int); //函数原型声明int judgeyear(int year){if((year%400==0)||(year%4==0&&year%100!=0)) //判断输入的年份是否为闰年模块return 1;elsereturn 0;}int monthdays(int year,int month) //计算各个月份的天数{if(month==2){if(judgeyear(year)==1) return 29;else return 28;}else if(month==4||month==6||month==9||month==11)return 30;elsereturn 31;}void f1(){int year,t,i,month;cout<<"请输入年份:";cin>>year;t=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7; //判断这一年的元旦是星期几for(int k=1;k<=12;k++){cout<<k<<"月份的日历如下"<<endl;cout<<setw(6)<<"日"<<setw(6)<<"一"<<setw(6)<<"二"<<setw(6)<<"三"<<setw(6)<<"四"<<setw(6)<<"五"<<setw(6)<<"六"<<endl;for(int z=1;z<=t;z++)cout<<setw(6)<<' ';for(i=1;i<=monthdays(year,k);i++){cout<<setw(6)<<i<<setw(6);if((i+t)%7==0)cout<<endl;}t=(t+monthdays(year,k)%7)%7;cout<<endl;//日历显示模块}}void f2(){int year,month,day;cout<<"请输入年份:";cin>>year;cout<<"请输入月份:";cin>>month;cout<<"请输入此年此月相应的日期"<<"<1~31>:";cin>>day;int l,n,t,w,date(0);char *week[]={"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};n=(year-1900);l=(n-1)/4;n=l+n;n=n%7;n=n;for(int i=1;i<month;i++)date+=monthdays(year,i);date+=day;n=n+date;n=n%7;cout<<"\n该天是:"<<week[n];}//日子查询模块void main(){int i=1;cout<<" --------------------------------"<<endl;cout<<" * *"<<endl;cout<<" 欢迎进入万年历查询系统"<<endl;cout<<" * *"<<endl;cout<<"--------------------------------"<<endl<<endl<<endl;cout<<"请选择您的查询内容:"<<endl;cout<<" "<<"1.显示一年的日历"<<";"<<endl;cout<<" "<<"2.显示某一天是星期几"<<";"<<endl;cout<<" "<<"0.退出"<<";"<<endl;cout<<"请选择按键"<<"<0-2>:"; //输出主菜单while(i){cin>>i;if(i>=0&&i<=2){switch(i){case 1: f1(); break;case 2: f2(); break;case 0: cout<<"谢谢使用,再见!";break;}}}}5、运行结果1程序运行测试:在电脑中打开C++应用程序, 首先进入VC++6.0,将程序代码输入,编译,组建,调试。