C语言课程设计
- 格式:doc
- 大小:1.42 MB
- 文档页数:49
《程序设计基础》课程设计报告题目:制作万年历井字棋游戏员工工资管理系统院(系):计算机与电子系专业班级:计算机科学与技术1101班学生姓名:杜海学号:20111183008指导教师:金兰20 12 年 6 月 11 日至20 12 年 6 月 22 日华中科技大学武昌分校制程序设计基础课程设计任务书目录1制作万年历 (6)1.1需求与总体设计 (6)1.2详细设计 (7)1.3编码实现 (9)2井字棋游戏 (12)2.1需求与总体设计 (12)2.2详细设计 (14)2.3编码实现 (19)3.员工工资管理系统 (28)3.1需求与总体设计 (28)3.2详细设计 (31)3.3编码实现 (36)总结 (46)1制作万年历1.1需求与总体设计1)总体设计结构:计算某年前的所有天数,确定这年的第一天为星期几。
输入这年的年份,通过函数运算,显示公元后任何年份的日历,日历以月份顺序排列,每月以星期顺序排列。
根据历法,得到:闰年条件:年份可以被四整除,并且不能被100整除,或者可以被400整除。
闰年:366天,二月有29天平年:365天,二月有28天通过函数求得年份的天数和那年二月的天数2)函数的声明:主要是通过定义一些函数来求天数如:int GetMonthDays(iny,ingm); /* y年m月的天数*/ int GetYeatDays(int y); /*年份y的天数*/int DateToNum(int year,int month,int day);返回从公元1年1月1日起的天数int Week(int year,int month,int day); /*求日期是星期几*/3)界面设计:编译好程序,运行程序既可进入以下的界面,在此界面中输入需要查询的年份既可。
输入年份后即出现要查询的那年的12个月的月历,因为平闰年的不同,平闰年的2月的天数也是不同的,如下图就是2011年和2012年的2月的月历,2011年的2月有28天,2012年的2月有29天。
1.2详细设计:下图即为万年历制作的N-S图:1)main函数:先初始化指针数组的各个元素,再输入的年份,对12个月进行循环,在循环中:利用一个循环输出若干空格,通过用一个循环和GetMonehDays函数计算输出第day天,当Week(year,month,day)等于0时换行。
初始化指针数组的元素输入yearYear<=0显示年份for(month=1;month<=12;month++)输出一条横线输出月份输出星期日到星期六for(i=0;i<Week(year,month,1);i++)输出若干空格for(day=1;day<=GetMonthDays(year,month,1);i++)day!=1&&Week(year,month,day)==0Y N换行输出第day天输出一条横线(1)main函数2)DateToNum函数:通过循环累加到今年的天数,载通过累加计算出到这个月的天数再加上到今天的天数。
3)GetMonthDays函数:通过switch函数对不同的月份进行分类,再在不同的月份规定各自的天数,当二月时再用if语句对平年和余年分别规定天数。
m1357810124681023130闰闰Y N2928n=0for(y=1;y<year;y++)n+=GetMonthDays(y) for(m=1;m<month;m++)n+=GetMonthDays(y,m)n+=day(2)DateToNum函数1.3编码实现:#include <stdio.h>#include <stdlib.h>int GetMonthDays(int y,int m) /*y年m月份的天数*/ {int n;switch (m){case 1:case 3:case 5:case 7:case 8:case 10:case 12:n=31;break;case 4:case 6:case 9:case 11:n=30;break;case 2:if(y%4==0&&y%100!=0||y%400==0)n=29;else n=28;}return n;}int GetYearDays(int y) /*年份y的天数*/ {if(y%4==0&&y%100!=0||y%400==0)return 366;elsereturn 365;}int DateToNum(int year,int month,int day) /*返回从公元1年1月1日起的天数*/ {int y,m,n=0;for(y=1;y<year;y++)n+=GetY earDays(y);for(m=1;m<month;m++)n+=GetMonthDays(y,m);n+=day;return n;}int Week(int year,int month,int day) /*求日期是星期几*/ {return DateToNum(year,month,day)%7;}int main(void){char *monthName[]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};int year,month,day;int i;do /*输入年份,不能为负值*/ {printf("输入年:");scanf("%d",&year);}while(year<=0);printf("%25d年\n",year);for(month=1;month<=12;month++) /*十二个月的循环输出*/ {printf("------------------------------------------------\n");printf("%27s\n", monthName[month-1]);printf("星期日星期一星期二星期三星期四星期五星期六\n");for(i=0;i<Week(year,month,1);i++)printf(" "); /*输出若干空格*/ for(day=1;day<=GetMonthDays(year,month);day++){if(day!=1&&Week(year,month,day)==0) /*星期日换行*/ printf("\n");printf("%5d ",day); /*输出day天*/}printf("\n------------------------------------------------\n");system("PAUSE"); /*调用库函数,输出系统提示信息*/return 0; /*返回值0,返回操作系统*/ }2井字棋游戏1.1需求与总体设计1)总体设计结构:在下棋过程中棋盘为棋局,对于一个棋局,某个选手的状态可能的胜,负,平或没结束。
设计一个子函数让选手进行选择是否先下,在定义一个子函数输出每次下棋后的棋盘状态,定义函数判断选手和计算机的胜利条件,最重要的是定义一个函数确定计算机的走法。
通过main函数调用子函数达到下棋的目的。
2)全局数据结构:某些变量,它们的取值被界定在一个有限的范围内。
把这些变量定义为字符型,整型或其它类型都不很合理,于是使用枚举类型:定义选手棋局状态的类型:t ypedef enum{W IN,LOSE,TIE,UNEND}StatusType;定义选手:t ypedef enum{HUMAN,COMPUTER}PlayerTapy;此系统需要对一些类型不同但又相互关联的数据进行处理,所以定义结构体类型:Typedef struct{int row; /*行号*/int col;/*列号*/}PositionType;3)函数的声明:StatusType ChessStatus(PlayerType player);/*选手player当前棋局状态*/PositionType SelectByComputer(void);/*计算机选择的走法*/PositionType SelectByHuman(void);/*人选择的走法*/void Display(void);/*显示棋局*/3)界面设计:程序执行后进入如下的界面,这个界面,真人选手可以选择是否先走。
通过玩家的选择可以分别进入一下两个界面,左边一个是玩家选择闲走,则输入要走的棋格的行列号,右边的为计算机先走。
到最后会出现三种结果,玩家胜利,计算机胜利,下和了。
以下即为玩家胜利,计算机胜利和下和了三种情况。
1.2详细设计1)main函数:首先确定玩家是否先走。
如果人先走,通过SelectByHuman 确定人的走法,用while循环确定输赢,在循环中通过SelectByComputer 函数确定计算机的走法,通过if函数判定是谁胜利。
2)StatusType ChessStatus函数:用if函数判定人和计算机的胜利,输和下和了的条件。
3)PositionType SelectByComper函数:为了计算机走棋,为棋盘上的每个棋格打分,打分规则如下:如果棋格上没有棋子,则得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+1)%3, (j+1)%3)和((i+2)%3,(j+2)%3),在付对角线上的其他两个棋格的行号和列号为((i-1+3)%3, (j-1+3)%3)和((i-2+3)%3, (j-2+3)%3).4)PositionType SelectByHuman函数:确定人的走法,如果不符合条件则需要用do-while语句进行循环输入。