万年历.docx
- 文档编号:24648359
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:54
- 大小:537.37KB
万年历.docx
《万年历.docx》由会员分享,可在线阅读,更多相关《万年历.docx(54页珍藏版)》请在冰豆网上搜索。
万年历
《程序设计基础》
课程设计报告
题目:
万年历·井字棋·员工工资管理系统
院(系):
计算机与电子系
专业班级:
计算机科学与技术
学生姓名:
XXX
学号:
指导教师:
XX
2012年6月11日至2012年6月22日
程序设计基础课程设计任务书
一、设计(调查报告/论文)题目
万年历·井字棋·员工工资管理系统
二、设计(调查报告/论文)主要内容
1.制作万年历
主要内容:
显示公元后任何年份的日历,日历以月份顺序排列,每月以星期顺序排列,类似于一般挂历上的格式,可参考如下格式:
输入年份:
2010
2010年
一月
星期日星期一星期二星期三星期四星期五星期六
12
3456789
10111213141516
17181920212223
24252627282930
31
…
…
十二月
星期日星期一星期二星期三星期四星期五星期六
1234
567891011
12131415161718
19202122232425
262728293031
请按任意键继续…
2.井字棋游戏
主要内容:
井字棋游戏是小朋友经常玩的小游戏,在正方形中有一个“井”字,把正方形分为9个格,就形成一个棋盘,如图1所示,实际上就是一个3×3方格的棋盘,一个玩家选择一个棋格画×,紧接着另一个玩家选择一个空棋格画○,双方轮流走棋,直到一个玩家占领一行,一列或一条对角线获胜,这时比赛结束,图2为画×的选手获胜示意图。
设计一个程序实现人与计算机玩井字棋游戏,假设计算机画×,人画○,人可选择是否先走。
图1井字棋的棋盘图2画×的选手获胜示意图
3.员工工资管理系统
主要内容:
设计一个利用文件处理方式实现对员工工资(包括员工编号、员工姓名、应发、扣款和实发)进行管理,具有增加数据、更新数据、查询数据、删除数据、列表显示数据以及重组文件的功能。
员工工资管理系统由六大功能模块组成:
增加数据
该模块完成将输入的数据存入数据文件中,用户一次可输入多个员工的信息。
更新数据
该模块用于实现对记录的修改,首先用户输入员工的编号,然后查询该员工的信息,最后更新该员工的信息。
查询数据
该模块可选择按员工编号查询,或者按员工姓名进行查询,然后列出满足条件的且未作删除标记的员工信息。
删除数据
该模块用于删除指定编号的员工工资信息,为提高效率,只作删除标记,不在物理上删除信息,可称为逻辑删除。
显示数据
该模块用于以列表方式显示所有未作删除标记的员工信息。
重组文件
当逻辑删除的信息太多时,将会降低查询效率。
重组文件模块专门用于在物理上删除作有删除标记的信息,这样不但提高查询效率,同时也节约存储空间。
课程设计要求:
课程设计共计三道必做题,其中第一题和第二题必做,由各位同学独立完成,第三道题由两位同学协作共同完成。
系统要求在MicrosoftVisualC++6.0编译平台上采用C语言编程实现。
三、原始资料
1.游洪跃,彭骏,谭斌.C语言程序设计实验与课程设计教程.北京:
清华大学出版社,2011.
2.孙承爱,赵卫东.程序设计基础—基于C语言.第2版.北京:
清华大学出版社,2010.
四、要求的设计(调查/论文)成果
1.课程设计报告
2.课程设计软件
五、进程安排
布置任务,查找资料、需求分析1天
总体设计1天
详细设计1天
编制源程序实现3天
测试与修改1天
撰写课程设计报告2天
六、主要参考资料
[1]谭浩强.C程序设计.第四版.清华大学出版社,2010.
[2]苏小红.C语言大学实用教程.第2版.电子工业出版社,2008.
目录
1需求与总体设计…………………………………………………………………………7
1.万年历……………………………………………………………………………………7
2.井字棋……………………………………………………………………………………14
3.员工工资管理系统………………………………………………………………………27
2详细设计…………………………………………………………………………………8
1.万年历…………………………………………………………………………………8
2.井字棋…………………………………………………………………………………14
3.员工工资管理系统………………………………………………………………………29
3编码实现…………………………………………………………………………………10
1.万年历……………………………………………………………………………………10
2.井字棋……………………………………………………………………………………18
3.员工工资管理系统………………………………………………………………………33
总结…………………………………………………………………………………………40
(要求:
目录题头用三号黑体字居中书写,隔行书写目录内容。
目录中各级题序及题标用小四号黑体字)
万年历
1需求与总体设计
制作一个万年历,能显示公元后任何年份的所有月份的具体日历,每月以星期顺序排序,类似一般的挂历的格式。
界面要求简洁易懂,容易观察。
用函数GetMonthDays()返回某年某月的天数,可根据是否大月(第1,3,5,7,8,10,12月为大月)与小月(第4,6,9,11月为小月),如是2月,还要根据是否为平年进行判断吧,平年的2月天数为28天,闰年的2月为29天。
用函数GetYearDays()返回某年的天数时,根据是否为闰年进行判断,闰年的天数为366天,平年的天数为365天。
用函数DateToNum()求从公元1年1月1日起的某年某月某天的天数时,先累加某年之前各年的天数,再累加某年某月之前各月的天数,再加上某月已过的天数即可。
用函数Week()返回求日期是星期几时,首先求出返回从公元1年1月1日起到某日期的天数,再根据公元1年1月1日是星期1,因此某日期是星期几的公式为:
DateToNum(y,m.d)%7
1.2全局数据结构:
定义如下函数:
intGetMonthDays(inty,intm)/*y年m月份的天数*/
intGetYearDays(inty)/*年份y的天数*/
intDateToNum(intyear,intmonth,intday)
/*返回从公元1年1月1日起的天数*/
intWeek(intyear,intmonth,intday)/*求日期是星期几*/
1.3界面设计:
进入如图1所示的界面后,查询的人只要输入要查询的年份即可。
2详细设计
图
(1)主函数图
(2)GetMonthDays()函数
图4GetYearDays()函数图5DateToNum()函数
图五
3编码实现
/*文件路径名:
month_calendar\main.c*/
#include
#include
intGetMonthDays(inty,intm)/*y年m月份天数*/
{
intn;/*天数*/
switch(m)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
n=31;/*第1,3,5,7,8,10,12月为大月*/
break;
case4:
case6:
case9:
case11:
n=30;/*第4,6,9,11月为小月*/
break;
case2:
if(y%4==0&&y%100!
=0||y%400==0)n=29;/*闰年2月有29天*/
elsen=28;/*平年2月有28天*/
}
returnn;/*返回当前月份天数*/
}
intGetYearDays(inty)/*年份y天数*/
{
if(y%4==0&&y%100!
=0||y%400==0)return366;/*闰年有366天*/
elsereturn365;/*平年有365天*/
}
intDateToNum(intyear,intmonth,intday)/*返回从公元1年1月1日起的天数*/
{
inty,m,n=0;/*年份,月份与天数*/
for(y=1;y n+=GetYearDays(y); for(m=1;m n+=GetMonthDays(y,m); n+=day;/*累加当前月过的天数*/ returnn;/**/ } intWeek(intyear,intmonth,intday)/*求日期是星期几*/ { returnDateToNum(year,month,day)%7;/*返回日期是星期几*/ } intmain(void)/*主函数main()*/ { char*monthName[]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",};/*月份中文名称*/ intyear,month,day;/*年月日*/ inti;/*临时变量*/ printf("输入年: "); scanf("%d",&year);/*输入年*/ printf("%25d年\n",year);/*显示年份*/ for(month=1;month<=12;month++) { printf("--------------------------------------------------\n");/*打印一条横线*/ printf("%27s\n",monthName[month-1]);/*显示月份*/ printf("星期日星期一星期二星期三星期四星期五星期六\n"); for(i=0;i printf("");/*输出若干空格*/ for(day=1;day<=GetMonthDays(year,month);day++) {/*输出一个月的每一天*/ if(day! =1&&Week(year,month,day)==0)printf("\n");/*星期日*/ printf("%7d",day);/*输出第day天*/ } printf("\n--------------------------------------------------\n"); return0;/*返回值0,返回操作系统*/ } 部分效果图: 井字棋 1需求与总体设计 井字棋是一种常见的游戏,在正方形中有一个“井”字,把正方形分成9个格,就形成了一个棋盘,如图 实际上是一个3X3方格的棋盘,一个玩家选择一个棋格画X,紧接着另一个玩家选择一个空格画O,双方轮流走棋,知道一个玩家占领一行或者一列或者以对角线获胜,这时比赛结束,如图 要求是人与机器的对战,可以选择先手。 在下棋过程中棋盘为一个棋局,某个选手的状态可能是胜,负或者平或者下棋还没有结束,因此定义表示选手的棋局状态的类型如下: 1.2全局数据结构 Typedefenum {/*状态: WIN(胜),LOSE(负),TIE(平)……*/ WIN,LOSE,TIE,UNEND }StatusType; 为了可读性强,用枚举类型表示选手,定义如下: Typedefenum {/*选手: HUMAN(真人),COMPUTER(计算机)*/ HUMAN,COMPUTER }PlayerType; 为了表示棋格的位置,用棋格的行号与列号来表示,具体的定义如下: Typedefstruct {/*位置*/ Introw;/*行号*/ Intcol;/*列号*/ }PositionType; 为了方便计算机走棋,为棋盘上每个棋格打分,打分规则如下: 如果棋格上有棋子,则得0分; 如果棋格上没有棋子,但棋格所在行,列或对角线有两个X,则得6分; 如果棋格上没有棋子,但棋格所在行,列或对角线有两个O,则得5分; 如果棋格上没有棋子,但棋格所在行,列或对角线其他棋格有一个X和一个没有棋子,则得4分; 如果棋格上没有棋子,但棋格所在行,列或对角线其他棋格有一个O和一个没有棋子,则得3分; 如果棋格上没有棋子,但棋格所在行,列或对角线没有棋子,则得2分; 如果棋格上没有棋子,但棋格所在行,列或对角线有一个X或O,得1分。 选择分值最高者为计算机的走棋,为了更灵活,如果有多个棋格得分值都为最高分,则随机选择一个分值最高的棋格作为计算机的走棋。 如果当前的棋格行号和列号为(i,j),则在同一行中其中的两个棋格的行号和列号为(i,(j+1)%3)和(i,(j+2)%3),在同一列中其中两个棋格的行号与列号为((i+1)%3,j)和((i+2)%3,j),在主对角线上的其他两个棋格得行号和列号为((i+3)%3,(j+1)%3)和((i+2)%3,(j+2)%3),在副对角线上的其他两个棋格的行号与列号为((i+3)%3,(j-1+3)%3)和((i+2)%3,(j-2+3)%3)。 1.3界面概况: 2详细设计 图1主函数 图2StatusTypeChessStatus(PlayerTypeplayer) 选手player当前棋局状态 图3PositionTypeSelectByComputer()计算机选手的走法 图4PositionTypeSelectByHuman()图5Display() 真人选手的走法显示棋局 3编码实现 #include #include #include typedefenum { WIN,LOSE,TIE,UNEND }StatusType; typedefenum { HUMAN,COMPUTER }PlayerType; typedefstruct { introw; intcol; }PositionType; StatusTypeChessStatus(PlayerTypeplayer); PositionTypeSelectByComputer(void); PositionTypeSelectByHuman(void); voidDisplay(void); charchess[3][3]={ {'','',''}, {'','',''}, {'','','',} }; intmain(void) { PositionTypegrid; charisfirst; do { printf("是否先走(Y/N)? "); scanf("%c",&isfirst); while(getchar()! ='\n'); }while(isfirst! ='Y'&&isfirst! ='y'&&isfirst! ='N'&&isfirst! ='n'); if(isfirst=='Y'||isfirst=='y') { grid=SelectByHuman(); chess[grid.row][grid.col]='O'; Display(); } while (1) { grid=SelectByComputer(); printf("计算机选手走的棋格是: %d,%d\n",grid.row,grid.col); chess[grid.row][grid.col]='X'; Display(); if(ChessStatus(COMPUTER)==WIN) { printf("计算机胜,真人选手还需努力! \n"); break; } elseif(ChessStatus(COMPUTER)==LOSE) { printf("真人选手胜,计算机不过如此! \n"); break; } elseif(ChessStatus(COMPUTER)==TIE) { printf("下合了! \n"); break; } grid=SelectByHuman(); chess[grid.row][grid.col]='O';/*计算机选手的棋子为O*/ Display(); if(ChessStatus(HUMAN)==WIN) {/*计算机选手胜*/ printf("真人选手胜,计算机也不过如此! \n"); break;/*棋已结束*/ } elseif(ChessStatus(HUMAN)==LOSE) {/*手棋*/ printf("计算机胜,真人选手还需努力! \n"); break;/*棋已结束*/ } elseif(ChessStatus(HUMAN)==TIE) {/*手棋*/ printf("下和了! \n"); break;/*棋已结束*/ } } system("PAUSE");/*调用库函数system(),输出系统提示信息*/ return0;/*返回值0,返回操作系统*/ } StatusTypeChessStatus(PlayerTypeplayer)/*选手player当前的棋局状态*/ { if(player==HUMAN) {/*真人选手*/ if(chess[0][0]=='O'&&chess[0][1]=='O'&&chess[0][2]=='O'|| /*第一行*/ chess[1][0]=='O'&&chess[1][1]=='O'&&chess[1][2]=='O'|| /*第二行*/ chess[2][0]=='O'&&chess[2][1]=='O'&&chess[2][2]=='O'|| /*第三行*/ chess[0][0]=='O'&&chess[1][0]=='O'&&chess[2][0]=='O'|| /*第一列*/ chess[0][1]=='O'&&chess[1][1]=='O'&&chess[2][1]=='O'|| /*第二列*/ chess[0][2]=='O'&&chess[1][2]=='O'&&chess[2][2]=='O'|| /*第三列*/ chess[0][0]=='O'&&chess[1][1]=='O'&&chess[2][2]=='O'|| /*主对象线*/ chess[0][2]=='O'&&chess[1][1]=='O'&&chess[2][0]=='O' /*真人选手胜*/ )returnWIN; elseif(chess[0][0]=='X'&&chess[0][1]=='X'&&chess[0][2]=='X'|| /*第一行*/ chess[1][0]=='X'&&chess[1][1]=='X'&&chess[1][2]=='X'|| /*第二行*/ chess[2][0]=='X'&&chess[2][1]=='X'&&chess[2][2]=='X'|| /*第三行*/ chess[0][0]=='X'&&chess[1][0]=='X'&&chess[2][0]=='X'|| /*第一列*/ chess[0][1]=='X'&&chess[1][1]=='X'&&chess[2][1]=='X'|| /*第二列*/ chess[0][2]=='X'&&chess[1][2]=='X'&&chess[2][2]=='X'|| /*第三列*/ chess[0][0]=='X'&&chess[1][1]=='X'&&chess[2][2]=='X'|| /*主对象线*/ chess[0][2]=='X'&&chess[1][1]=='X'&&chess[2][0]=='X' /*副对象线*/ )returnLOSE;/*真人选手负*/ elseif(chess[0][0]! =''&&chess[0][1]! =''&&chess[0][2]! =''&& /*第一行*/ chess[1][0]! =''&&chess[1][1]! =''&&chess[1][2]! =''&& /*第二行*/ chess[2][0]! =''&&chess[2][1]! =''&&chess[2][2]! =''&& /*第三行*/ chess[0][0]! =''&&chess[1][0]! =''&&chess[2][0]! =''&& /*第一列*/ chess[0][1]! =''&&chess[1][1]! =''&&chess[2][1]! =''&& /*第二列*/ chess[0][2]! =''&&chess[1][2]! =''&&chess[2][2]! =''&& /*第三列*/ chess[0][0]! =''&&chess[1][1]! =''&&chess[2][2]! =''&& /*主对象线*/ chess[0][2]! =''&&chess[1][1]! =''&&chess[2][0]! ='' /*副对象线*/ )returnTIE;/*和棋*/ elsereturnUNEND; } else {/*计算机选手*/ if(chess[0][0]=='X'&&chess[0][1]=='X'&&chess[0][2]=='X'|| /*第一行*/ chess[1][0]=='X'&&c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 万年历