万年历.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;yn+=GetYearDays(y);
for(m=1;mn+=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;iprintf("");/*输出若干空格*/
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