万年历.docx

上传人:b****3 文档编号:11208416 上传时间:2023-05-29 格式:DOCX 页数:54 大小:537.37KB
下载 相关 举报
万年历.docx_第1页
第1页 / 共54页
万年历.docx_第2页
第2页 / 共54页
万年历.docx_第3页
第3页 / 共54页
万年历.docx_第4页
第4页 / 共54页
万年历.docx_第5页
第5页 / 共54页
万年历.docx_第6页
第6页 / 共54页
万年历.docx_第7页
第7页 / 共54页
万年历.docx_第8页
第8页 / 共54页
万年历.docx_第9页
第9页 / 共54页
万年历.docx_第10页
第10页 / 共54页
万年历.docx_第11页
第11页 / 共54页
万年历.docx_第12页
第12页 / 共54页
万年历.docx_第13页
第13页 / 共54页
万年历.docx_第14页
第14页 / 共54页
万年历.docx_第15页
第15页 / 共54页
万年历.docx_第16页
第16页 / 共54页
万年历.docx_第17页
第17页 / 共54页
万年历.docx_第18页
第18页 / 共54页
万年历.docx_第19页
第19页 / 共54页
万年历.docx_第20页
第20页 / 共54页
亲,该文档总共54页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

万年历.docx

《万年历.docx》由会员分享,可在线阅读,更多相关《万年历.docx(54页珍藏版)》请在冰点文库上搜索。

万年历.docx

万年历

《程序设计基础》

课程设计报告

 

题目:

万年历·井字棋·员工工资管理系统

院(系):

计算机与电子系

专业班级:

计算机科学与技术

学生姓名:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2