《课程设计报告(网吧管理系统).doc》由会员分享,可在线阅读,更多相关《课程设计报告(网吧管理系统).doc(27页珍藏版)》请在三一办公上搜索。
1、软件学院课程设计报告 网吧管理系统年级班级: 专业方向: 学 号: 姓 名: 指导老师: 二零一零年六月一、问题描述本程序是一个网吧管理程序,首先选择界面选择需要的服务,包括查询空机位,预订与取消机位,用户可通过屏幕提示,查询自己的信息,包括打印预订单,等候单,以及打印用户列表。操作简洁,较易掌握。 二、基本要求1、软件要求Windows XP、Windows Vista、Windows7 64位系统。使用VC+6.02、硬件要求CPU:CORE I5 2.14GHZ 内存:4G三、需求分析1、功能需求 实现对网吧机位的预定,查询,取消预订,以及打印预订与候选单。2、性能需求根据系统提示选择查
2、询以及预定的时间段 四、测试数据 查询时间:2010-06-23 时间段:1 机位预订:2010-06-23 时间段:1 预订者姓名:杨骥 预订者电话:123 打印预订单; 输出:预定日期:2010-06-23 预定时间:08:00 联系电话:123 五.疑难解答六. 心得体会与研究方向通过对C语言的学习,了解C语言的基本知识,运用C语言可以解决许多实际问题,尤其是在信息管理方面,C语言作为一门高级和计算机编程语言,有其强大的功能。同时我也知道了我们随时都要培养自己的动手能力,只有这样,才能更好的适应这个日新月异的飞速发展的社会。在系统的时候发现自己的能力还是有限,要想学好C语言,并且灵活应用
3、还是需要下苦功夫的,在接下来的暑假中我会经常上机实践,做到熟练掌握C语言中的精华。数据结构是C语言的基础,希望能在把编程练习好之后,继续深入学习数据结构,并结合C语言来继续进一步提高编程能力。七. 程序源代码#include #include #include #define N 1 /* 计算机总台数,可以根据实际需要改动 */#define P 11 /* 定义输入的日期字符数组,其格式为2009-12-23,共11位(包含0),无需改动 */#define T 12 /* 手机号码长度,共12位(包含0) */#define S 13 /* 表示时间段的输出长度,如8:00-10:00,
4、共占13位 */* 数据结构的定义 */* 计算机类(关于类,有点OOP的的意味,在这里可以理解为相关数据在内存中的表现形式) */struct Computer int no; /* 计算机编号,个人感觉在这里没多大用处 */ int isOrder; /* 是否被预定,0表示未预定,1表示已预定 */;/* 用户类 */struct User char nameP; /* 用户姓名 */ char telT; /* 用户联系方式 */ struct User *next; /* User类型指针 */;/* 预订信息类 */struct OrderInfo char dateP; /* 日
5、期 */ int time; /* 时间段 */ struct User *user; /* User类型指针,指向一个User类型节点 */ struct OrderInfo * next;/* 重命名结构体 */typedef struct Computer Computer;typedef struct OrderInfo OrderInfo;typedef struct User User;/* 定义相关全局变量 */static Computer computersN; /* 表示20台计算机的数组 */static OrderInfo orderList; /* 预订单,以链表表示
6、 */static OrderInfo waitList; /* 等候单 */static User userList; /* 用户列表 */static OrderInfo *orderHead = &orderList; /* 指向预订单头结点的指针 */static OrderInfo *waitHead = &waitList; /* 指向等候单头结点的指针 */static User *userHead = &userList; /* 指向用户列表头结点的指针 */static OrderInfo *orderCurrent = &orderList; /* 指向预订单队尾的指针,初
7、始指向头结点 */static OrderInfo *waitCurrent = &waitList; /* 指向等候单队尾的指针,初始指向头结点 */static User *userCurrent = &userList; /* 指向用户列表队尾的指针,初始指向头结点 */static char strS = 0;/* 函数声明 */void init(); /* 系统初始化,相关全局变量的初始化 */void mainMenu(); /* 主菜单中的选项逻辑处理 */int select(char date,int time); /* 通过日期和时间段进行查询,返回繁忙的计算机的数目 *
8、/void order (char date,int time); /* 处理预定信息 */void printInfo(char date,int time,int *used,int *wait); /* 通过日期和时间段打印出相关预订单和等候单的信息,并以指针形式返回预定数目和等候数目 */void deleteFromOrderList(char date,int time,int n); /* 从预订单中删除相关条目,并将等候单中第一个用户自动添加到预订单中 */void deleteFormWaitList(char date,int time,int n); /* 从等候单中删除
9、相关条目 */void cancel(char date,int time); /* 通过日期和订单号删除相关条目 */int getDate(char date,int i); /* 获得日期的输入,并进行相关判断操作 */int isBusy(int count); /* 判断是否满员 */char* showTime(int time); /* 输出相应时间段 */void showMenu(); /* 显示主菜单选项 */int getFreeTime(char date, int time); /* 通过日期和时间段获得当前是否满员,1表示未满 */void insertIntoLi
10、st(int i,char date,int time,char name,char tel); /* 向链表中插入数据 */* 程序入口点 */void main() init(); mainMenu();/* 系统初始化(全局变量的初始化) */void init() int i; for(i = 0; i N; i+) computersi.no = i; computersi.isOrder = 0; strcpy(orderList.date,); orderList.time = 0; orderList.user = NULL; orderList.next = NULL; st
11、rcpy(waitList.date,); waitList.time = -1; waitList.user = NULL; waitList.next = NULL;/* 显示主菜单选项 */void showMenu() printf(*欢迎使用网吧管理系统*n); printf(n); printf( 1.查询n); printf( 2.机位预定n); printf( 3.取消预定n); printf( 4.退出系统n);/* 调试功能,以下三项是做测试时使用的,可以根据实际需要增删 */* * */ printf( 5.打印预订单n); printf( 6.打印等候单n); prin
12、tf( 7.打印用户列表n);/* */ printf(n); printf(请输入您的选择: ); printf(n);/* 输出相应时间段 */char *showTime(int time) switch(time) case 1: strcpy(str,08:00-10:00); break; case 2: strcpy(str,10:00-12:00); break; case 3: strcpy(str,12:00-14:00); break; case 4: strcpy(str,14:00-16:00); break; case 5: strcpy(str,16:00-18:
13、00); break; case 6: strcpy(str,18:00-20:00); break; return str;/* 主菜单逻辑处理 */void mainMenu() int choice = 0; /* 选项 */ char dateP,ch; int time = -1; /* 时间段初始化为-1 */ int i,result; /* result表示输入时间数据是否满足相关要求 */* 若要开启调试功能,以下注释也应去掉 */* * */ OrderInfo *orderTemp; OrderInfo *waitTemp; User *userTemp;/* */ sh
14、owMenu(); /* 显示相关选项 */ do /* 需要循环判断,知道输入4(退出)时才结束程序 */ scanf(%d,&choice); switch(choice) case 1 : /* 查询 */ /*这条语句主要是由于在getDate()函数中将会捕获到在主菜单中选择相应功能后的那个回车, 此时选择1,然后回车,它将捕获到这个回车,造成不必要的麻烦*/ ch = getchar(); printf(请输入日期,格式yyyy-mm-dd(如:2009-12-22):n); result = getDate(date,P); while(result != 1) /* 判断是否满
15、足相应输入要求 */ result = getDate(date,P); printf(请选择时间段:n); for(i = 1; i = 6; i+) printf(%d. %sn,i,showTime(i); /* showTime(),打印相关的时间段信息 */ scanf(%d,&time); while(time 6) /* 同样是进行输入校验 */ printf(对不起,您输入的参数有误,请核对后重新输入!nn); scanf(%d,&time); isBusy(select(date,time); /* isBusy()判断是否满员 */ system(pause); /* sy
16、stem(pause)-暂停DOS窗口输出 */ break; case 2 : ch = getchar(); printf(请输入日期,格式yyyy-mm-dd(如:2009-12-22):n); result = getDate(date,P); while(result != 1) result = getDate(date,P); printf(请选择时间段:n); for(i = 1; i = 6; i+) printf(%d. %sn,i,showTime(i); scanf(%d,&time); while(time 6) printf(对不起,您输入的参数有误,请核对后重新输
17、入!nn); scanf(%d,&time); order(date,time); /* 调用预定相关逻辑处理函数 */ system(pause); break; case 3 : ch = getchar(); printf(请输入日期,格式yyyy-mm-dd(如:2009-12-22):n); result = getDate(date,P); while(result != 1) result = getDate(date,P); printf(请选择时间段:n); for(i = 1; i = 6; i+) printf(%d. %sn,i,showTime(i); scanf(%
18、d,&time); while(time 6) printf(对不起,您输入的参数有误,请核对后重新输入!nn); scanf(%d,&time); cancel(date,time); /* 调用取消预定相关逻辑处理 */ system(pause); break; case 4 : printf(欢迎下次继续使用!n); exit(0); /* 退出程序 */ break;/* 调试功能,以下部分是前面提到的调试时使用,可以按照需要选择增删此部分,这两部分应同时开启或关闭,以免引起不必要的麻烦 */* * */ case 5 : if(orderCurrent = orderHead) p
19、rintf(暂无相关信息n); printf(nn); else orderTemp = orderHead-next; while(orderTemp != NULL) printf(预定日期: %sn,orderTemp-date); printf(预定时间: %sn,showTime(orderTemp-time); printf(预定者 : %sn,orderTemp-user-name); printf(联系方式: %sn,orderTemp-user-tel); printf(nn); if( orderTemp-next != NULL) orderTemp = orderTem
20、p-next; else break; system(pause); break; case 6 : if(waitHead-next = NULL) printf(暂无相关信息n); printf(nn); else waitTemp = waitHead-next; while(waitTemp != NULL) printf(预定日期: %sn,waitTemp-date); printf(预定时间: %sn,showTime(waitTemp-time); printf(预定者 : %sn,waitTemp-user-name); printf(联系方式: %sn,waitTemp-u
21、ser-tel); printf(nn); if(waitTemp-next != NULL) waitTemp = waitTemp-next; else break; system(pause); break; case 7 : if(userCurrent = userHead) printf(暂无相关信息n); printf(nn); else userTemp = userHead-next; while(userTemp != NULL) printf(联系人姓名: %sn,userTemp-name); printf(联系人电话: %sn,userTemp-tel); print
22、f(nn); if(userTemp-next != NULL) userTemp = userTemp-next; else break; system(pause); break;/*/ default : printf(对不起,您输入的参数有误,请核对后重新输入!nnn);system(pause); system(cls); /* system(cls)-清空当前DOS窗口中的内容 */ showMenu(); while(choice != 4); /* 除非输入4,否则将不会结束循环 */* 获得日期的输入,并进行相关判断操作,其中i表示需要输入的字符串长度,如2009-12-23
23、,这个字符串就是11位的(包含0) */* 以下相关代码是进行输入校验的 */int getDate(char date,int i) char *p = date,ch; int m = 0 , result = 0 ,j; /* result表示输入是否合法,1表示合法 */ while(m =0 & ch = 9 | ch= -) /* 输入的字符只能为0到9以及- */ *p+ = ch; m+; else *p = 0; break; else *p =0; break; *p+ = 0; m+; if(m = i) /* 判断长度是否符合输入要求 */ result = 1; fo
24、r(j = 0; j date,date) = 0 & temp-time = time) count+; if(temp-next != NULL) /* 若为空,表示已到链表末尾,直接跳出循环 */ temp = temp-next; else break; while(temp != NULL); return count;/* 判断是否满员 */int isBusy(int count) int result = 0; /* 该变量作为返回值,指示该时间段是否满员,1表示已满,0表示空闲 */ /* 若使用数目大于20台,则提示无空闲机位,否则打印出空闲机位 */ if(count =
25、 N) printf(对不起,暂无空闲机位nn); result = 1; else printf(恭喜您,还剩%d个机位nn,N - count); return result; /* 该返回值表示是否满员 */* 通过日期和时间段获得当前是否满员,1表示未满 */int getFreeTime(char date, int time) int result = 0; int count = select(date,time); if(count N) result = 1; return result;/* 预定逻辑处理,首先判断是否满员,可以调用select函数 */void order (char date,int time) int result; char nameP; char telT; system(cls); printf(*欢迎使用网吧管理系统*nn); printf(您查询的时间段是: %s %snn,date,showTime(time); result = isBusy(select(date,time); if(result = 0) /* 未满 */