资源描述
C语言课程设计汇报
-----万年历
设计人:贾伟涛
学号:010912
班级:13电信应电班
指导老师:张伟
日期:6月9日
内容提要
经过大一下学期对C语言学习,了解到了很多C语言相关知识。学习过程即使有很多迷惑,不过当自己能够独立看懂和独立完成一个简单程序时,心中就会收获无限喜悦和成就感。我即使能够看懂部分简单程序,编写部分简单计算程序,更多是学会了一个思想——编程,它让我在去思索很多日常生活中事物是怎么样经过一个个小小函数实现功效,激发我对c语言爱好。
C语言是多年在中国外得到快速推广应用一个机器语言。C语言功效丰富,表示能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既含有高级语言优点,又含有低级语言很多特点。所以,C语言尤其适合于编写多种软件。
在这次课程设计中我将把日常生活中最常常接触——日历查询,利用C语言程序编成一个简单万年历查询系统。经过这个小小系统能够实现很多功效。在程序中你能看到很多熟悉C语言关键字,同时也加入了很多自己课外了解到部分关键字。在不停调试中最终才取得最为完整程序。接下来就是我C语言课程设计具体内容来了,大家拭目以待吧!
目录
一、 系统功效和数听说明-----------------------
二、 问题分析---------------------------------
三、 程序总体设计及功效结构框图---------------
四、 程序步骤图-------------------------------
五、 源程序代码-------------------------------
六、使用说明---------------------------------
七、个人心得---------------------------------
八、参考文件---------------------------------
一、系统功效和数听说明
(一)功效介绍
在日常生活中能接触到很多不一样类型日历,在日历上我们通常期望它能简单明了给我们最想要日期信息。在我万年历系统当中,就是将日历,月历做简单明了,很方便我们查询使用。下面是它要实现部分基础功效:
C语言编写万年历查询系统:
(1)输入年份,判定是否为闰年
(2)输入年月日,判定是星期几
(3)输入年份,打印出12个月月历
(4)输入年月,打印出本月日历
另新增:
(1) 对输入指令错误提醒
(2) 加入了调用系统时间函数
(3) 还添加了欢迎界面并进行界面优化
(二)程序中数听说明
①int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
这是定义相关每个月天数数组,依据大小月和二月份特殊情况将每个月天数变为数组中元素存入数组当中。其中days[1]=28,是将闰年二月天数28天作为初始元素存入。在经过yearMonth函数后就能够给days[1]中存入正确月天数。
② tm *tp;
char *week[]={"一","二","三","四","五","六","日"};
这两组数据设计全部利用了指针定义,利用指针能够提升程序可读性,能够更方便使用。这两个数组作用是用于调用系统时间,而定义星期数组*week[]和年月日变量*tp,因为还没学到指针,在这里查阅了很多资料,并也借鉴了前辈们很多程序。
二、问题分析
对于闰年判定,能被4整除但不能被100整除,或能被400整除年份为闰年,不然为平年。日期查询,就是直接打印改天所在月份月历。
程序难点在于判定星期,但依据公式,我们能够很轻易地用年月日推断出星期:
weekday=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
其中year:要查询年份
day:从该年一月一日起到该天天数
weekday:得出星期数。
在打印月历时,只要知道第一天星期,就能够依次输入后面日期,经过一定长度输出日期,在碰到某天时星期天时,就换行输出,所以能够根据月历格式输出。
对于初始输入目前系统时间,能够经过<time.h>中time 和localtime函数取出系统时间进行初始化。
判定日期是否正当,
if((year>=3000||year<=1600)||(month>=12||month<0)||(day>=31||day<=0))
{
system("CLS");
printf(" 输入错误,系统及立即返回!");
Sleep(3000);
goto tz;
}
能够先判定年月日是否有小于0值,月和日是否有超出最大值12和31 ,假如经过此判定正当,再判定是否时闰年,假如时闰年,则判定二月份是否满足要求,闰年二月份不能超出29天,平年二月份不能超出28天。在查询过程中,假如发觉输入不正当或不满足输入要求,则提醒错误,并返回主菜单。
三、程序总体设计及功效结构框图
(一)功效结构框图
系统时间显示
主菜单
星期查询
输出年历
输出月历
闰年判定
欢迎使用
(二)程序设计
头文件:#include<stdio.h>//标准输入输出函数
#include<stdlib.h>//清屏函数system()
#include<windows.h>//延时函数Sleep()
#include<time.h> //调用系统时间函数time()
在程序中利用了大量自定义函数,全部包含为了使程序更介绍明了。其中有:
int isLeapYear(int year)//判定是否为闰年
void hy()//欢迎信息;
void Time() //获取系统时间;
int whichWeekday(int year, int month, int day)//判定某天为星期几; void yearMonth(int year, int month)//打印某年某月月历;
void monthDay(int year)//输入年份,打出个月历;
void menu()//主菜单;
void main()//主函数;
这些函数定义及其对应内部程序共同构筑起了这个万年历查询系统总程序。其中isLeapYear函数是用来判定输入年份是否为闰年,实现了估计功效第一个方面;whichWeekday函数则是为了实现判定星期而编写;yearMonth函数则是为了实现月历而编写;Time()函数则是为调用系统时间而编写,该Time()函数采取指针形式定义了*week[]数组和*tp变量;yearMonth,monthDay 这两个函数共同使用就能够完成输出年历功效。
四、程序步骤图
(一)总步骤图
开始
计算是否为闰年
计算星期数
按键1?
按键3和44
输出是否为闰年
输出星期数
计算编辑接收到数据
输出具体年历和月历
按键5?
是
是
是
是
计算是否为闰年
计算星期数
按键2?
是
是
是
计算是否为闰年
计算星期数
是
是
是
是
结束 退出
(二)算法说明
1. 总天数算法:
isLeapYear函数使用,判定出了输入年份是否为闰年信息。判定十二个月是否为闰年方法是:该年分而能被4整除但不能被100整除,或是能被400整除。
判定是否为闰年步骤图:
2.输入日期计算星期几:
利用whichWeekday函数能够判定出星期,然后对于输入日期能够经过公式weekday=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7计算就能够输出对应星期数。
int whichWeekday(int year, int month, int day)//判定某天为星期几
{
int weekday;
if (month == 1 || month == 2)//公式中要把月和月换成是上十二个月月和月
{
month += 12;
year -= 1;
}
weekday=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7; //计算星期公式
return weekday+1;
}
3. 对输入信息汇总:
void yearMonth(int year, int month)//打印某年某月月历,void monthDay(int year)//输入年份,打出个月历;经过这两个函数能够将输入数据具体信息经过完整日历形式表示出来。
void yearMonth(int year, int month)//打印某年某月月历
{
int i,j=0;
int weekday; //计算这个月第一天是星期几
weekday = whichWeekday(year, month, 1);
printf("\n %d年%d月\n",year,month);
printf(" ------------------------------------------------\n");
printf(" 星期一星期二星期三星期四星期五星期六星期天\n");
if(isLeapYear(year) && month == 2)
days[1] = days[1] + 1;
printf(" ");
for(i = 1; i < weekday; i ++)
printf(" ");
for(i = 0; i < 8 - weekday; i ++)
{
printf("%6d", i+1);
printf(" ");
}
printf("\n ");
for(i = 9-weekday; i <= days[month-1]; i ++,j++)
{
if(j == 7)
{
j = 0;
printf("\n ");
}
printf("%6d ", i);
}
printf("\n ------------------------------------------------\n");
}
void monthDay(int year)//输入年份,打出个月历
{
int i;
for(i = 0; i < 12; i ++)
yearMonth(year,i+1);
printf("\n\n");
}
五、源程序代码
#include<stdio.h>//标准输入输出函数
#include<stdlib.h>//清屏函数system()
#include<windows.h>//延时函数Sleep()
#include<time.h> //调用系统时间函数time()
int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};//每个月天数,闰年二月要加
int isLeapYear(int year)//判定是否为闰年
{
if(year%4 == 0 && year%100 != 0 || year%400 == 0)
return 1;
else
return 0;
}
void hy()//欢迎信息
{
printf("\n 欢迎使用万年历查询系统\n\n");
Sleep(700);//延时毫秒
printf(" 祝您天天好心情!\n\n\n");
Sleep(1000);
printf(" 版本:v2.0\n\n\n");
Sleep(1000);
printf(" 正在进入功效菜单,请稍候》》\n");
Sleep(5000);//延时秒
}
void Time() //获取系统时间
{
time_t t;
struct tm *tp;
static char *week[]={"一","二","三","四","五","六","日"};
t=time(NULL);
tp=localtime(&t);
printf("\t ─────────────────────\n");
printf("\t\t 系统时间日期:%d年%d月%d日",tp->tm_year+1900,tp->tm_mon+1,tp->tm_mday);
printf(" %d:%d:%d ",tp->tm_hour,tp->tm_min,tp->tm_sec);
printf("星期%s\n",week[(tp->tm_wday)-1]);
printf("\t ─────────────────────\n");
}
int whichWeekday(int year, int month, int day)//判定某天为星期几
{
int weekday;
if (month == 1 || month == 2)//公式中要把月和月换成是上十二个月月和月
{
month += 12;
year -= 1;
}
weekday=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7; //计算星期公式
return weekday+1;
}
void yearMonth(int year, int month)//打印某年某月月历
{
int i,j=0;
int weekday; //计算这个月第一天是星期几
weekday = whichWeekday(year, month, 1);
printf("\n %d年%d月\n",year,month);
printf(" ------------------------------------------------\n");
printf(" 星期一星期二星期三星期四星期五星期六星期天\n");
if(isLeapYear(year) && month == 2)
days[1] = days[1] + 1;
printf(" ");
for(i = 1; i < weekday; i ++)
printf(" ");
for(i = 0; i < 8 - weekday; i ++)
{
printf("%6d", i+1);
printf(" ");
}
printf("\n ");
for(i = 9-weekday; i <= days[month-1]; i ++,j++)
{
if(j == 7)
{
j = 0;
printf("\n ");
}
printf("%6d ", i);
}
printf("\n ------------------------------------------------\n");
}
void monthDay(int year)//输入年份,打出个月历
{
int i;
for(i = 0; i < 12; i ++)
yearMonth(year,i+1);
printf("\n\n");
}
void menu()//主菜单
{
printf(" -----------------------------------------------\n");
printf(" ");
printf(" 万年历查询系统\n\n");
printf(" **************************************************\n");
printf(" ** 1、输入年份,判定是否为闰年 **\n");
printf(" ** 2、输入年月日,判定该日为星期几 **\n");
printf(" ** 3、输入年份,打出个月历 **\n");
printf(" ** 4、输入月份,打出该月日历 **\n");
printf(" ** 5、退出 **\n");
printf(" **************************************************\n\n");
}
void main()//主函数
{
int num,year,month,day,weekday;
char ch;
while(1)
{
system("CLS"); //清屏
hy();//欢迎信息
tz:system("CLS");//goto语句跳转菜单标志
Time();//调用系统函数
menu();//菜单
printf(" 请输入对应操作:");
scanf("%d", &num);
switch(num)
{
case 1:
{
system("CLS");
t1:printf("\n 请输入年份,确定按‘回车’(格式:):\n");//goto语句标志
scanf("%d", &year);
if(year>=3000||year<=1600)
{
system("CLS");
printf(" 输入错误,系统及立即返回!");
Sleep(3000);
goto tz;
}
if(isLeapYear(year))
printf(" %d年是闰年。\n",year);
else
printf(" %d年不是闰年。\n",year);
printf("提醒:\n如继续运行请按\n如回首菜单请按\n如退出请按\n请选择:");
ch=getch();
if(ch=='1')
goto t1;//goto语句返回t1
if(ch=='2')
goto tz;//实施主函数
if(ch=='0')
exit(0);//退出
break;
}
case 2:
{
system("CLS");
t2:printf("\n 请输入年月日,以空格隔开,确定按‘回车’(格式:6 10):\n");
scanf("%d%d%d", &year,&month,&day);
if((year>=3000||year<=1600)||(month>=12||month<0)||(day>=31||day<=0))
{
system("CLS");
printf(" 输入错误,系统及立即返回!");
Sleep(3000);
goto tz;
}
weekday = whichWeekday(year, month, day);
printf(" 这天是星期%d。\n\n",weekday);
printf("提醒:\n如继续运行请按\n如回首菜单请按\n如退出请按\n请选择:");
ch=getch();
if(ch=='1')
goto t2;
if(ch=='2')
goto tz;
if(ch=='0')
exit(0);
break;
}
case 3:
{
system("CLS");
t3:printf("\n 请输入年份,确定按‘回车’(格式:):\n");
scanf("%d", &year);
if(year>=3000||year<=1600)
{
system("CLS");
printf(" 输入错误,系统及立即返回!");
Sleep(3000);
goto tz;
}
monthDay(year);
printf("提醒:\n如继续运行请按\n如回首菜单请按\n如退出请按\n请选择:");
ch=getch();
if(ch=='1')
goto t3;
if(ch=='2')
goto tz;
if(ch=='0')
exit(0);
break;
}
case 4:
{
system("CLS");
t4:printf("\n 请输入年份(格式:):\n");
scanf("%d", &year);
printf(" 请输入月份,确定按‘回车’(格式:):\n");
scanf("%d", &month);
if((year>=3000||year<=1600)||(month>=12||month<0))
{
system("CLS");
printf(" 输入错误,系统及立即返回!");
Sleep(3000);
goto tz;
}
yearMonth(year,month);
if(isLeapYear(year) && month == 2)//假如年份为闰年,则月加天
days[1] = days[1] + 1;
printf("提醒:\n如继续运行请按\n如回首菜单请按\n如退出请按\n请选择:");
ch=getch();
if(ch=='1')
goto t4;
if(ch=='2')
goto tz;
if(ch=='0')
exit(0);
break;
}
case 5:
{
printf("\n 是否确定退出?\n");
printf(" 确定请按,取消请按");
ch=getch();
if(ch == '2')
goto tz;
else
{
printf(" ");
exit(0);//退出
}
break;
}
default:
{
system("CLS");
printf(" 您输入指令有误,请重新输入!!\n\n");
printf("提醒:\n如回首菜单请按\n如退出请按\n请选择:");
ch=getch();
if(ch=='1')
goto tz;
if(ch=='0')
exit(0);
break;
}
}
}
}
六、使用说明
运行程序,首优异入欢迎界面,等候3秒后,进入主菜单界面,可看到以下界面
─────────────────────
系统时间日期:6月10日 16:55:14 星期二
─────────────────────
-----------------------------------------------
万年历查询系统
**************************************************
** 1、输入年份,判定是否为闰年 **
** 2、输入年月日,判定该日为星期几 **
** 3、输入年份,打出12个月历 **
** 4、输入月份,打出该月日历 **
** 5、退出 **
**************************************************
请输入对应操作:
1、在“请输入对应操作:”后面输入功效序号,如需“输入年份,判定是否为闰年”,请输入“1”,其它功效雷同。
2、进入隶属界面后会出现以下界面:
请输入年份,确定按‘回车’(格式:):
3、可在“请输入年份,确定按‘回车’(格式:):”语句后输入年份””,会出现下面界面:
请输入年份,确定按‘回车’(格式:):
不是闰年。
提醒:
如继续运行请按1
如回首菜单请按2
如退出请按0
请选择:
4、可在“请选择:”后面填写序号,即可得到对应提醒功效。
5、 其它功效做法于上相同,就不一一赘述。
七、个人心得
(略)
八、参考文件
[1]谭浩强。C程序设计(第四版).北京:清华大学出版社,
[2]杜 恒。C程序程序设计(理实一体化教程).北京:机械工业出版社,
[3]部分资料起源网络,作者不详。在这里对她们表示由衷感谢
展开阅读全文