1、1课 程 项 目 报 告2课程项目任务书题 目 中小饭店点餐系统主要内容用 C 语言开发一个简单的中小饭店点餐系统。要求实现以下基本功能:(1) 有简单的用户管理功能。系统中有两类用户,系统管理员和服务员,不同用户在登陆系统后会有不同的菜单可进行不同的操作。(2) 系统管理员用户能完成以下功能:a )创建系统新用户,可以查找、浏览和更新用户信息;b)输入、查询、浏览、更新菜单信息;c)统计分析功能(如统计每个菜品被顾客选择情况、每个服务员每餐或每天服务顾客数量等) ;d)(可选)输入、查询、浏览、更新餐桌信息(如位置、可坐几人等) ;e)(可选)顾客信息浏览。(3) 服务员用户能完成以下功能:
2、a) 顾客信息录入(可以分店内消费、自带等) ;b) 菜单信息查询、浏览;c)顾客点餐以及点餐情况浏览、修改、删除、状态更新等功能;d) 费用计算; e) (可选)餐桌信息查询、浏览与更新等。其中功能(2)-b)与功能(3)-b)、功能(2)-d) 与功能(3)-e)有重叠,模块可重用。扩展功能:可以按照自己对问题的理解以及对 C 语言的掌握程度进行扩展。比如(1)菜品推荐;(2)餐位预定(3)网络(含互联网、电话、微信等)订餐;(4)VIP 顾客管理;(5)优惠券管理;(6)自定义菜品等等。还可以考虑支持外卖、加入对厨房、厨师的管理等功能。特别说明:尽可能地运用自己已经学习过的数据结构的知识
3、去展现 C 语言运用能力。任务要求一、提交材料应包括:(1)系统源代码 (2)课程项目报告二、整个设计过程具体要求(1)需求分析 要求学生对系统进行分析,设计出需要完成的功能,完善各个模块的调用关系;(2)设计过程 要求学生进一步明确各模块调用关系,进一步完善模块函数细节(函数名、参数、返回值等)(3)实现过程 要求学生养成良好的编码习惯、完成各个模块并进行测试,最终完成系统整体测试;(4)总结阶段 按照要求完成系统设计和实现报告,并进行总结、答辩。报告撰写情况(30 分) 系统完成情况(30 分) 答辩情况(40 分)内容20 分规范程度5 分程序测试5 分基本功能20 分扩展功能10 分自
4、述情况10 分回答问题30 分成绩评定总分3成绩评定教师: 41 需求分析题目要求设计并编写一个中小餐馆点餐系统,要求有一个餐厅管理员和若干个服务员,并要加入管理员对菜单,餐桌以及服务员的管理,并能够查看菜品选择情况以及服务员每天服务顾客数目。服务员要求能实现顾客点餐,加减菜品,创建菜品单以及结账功能。加入在管理员和服务员登入系统的时候进行密码验证,以及对服务员和管理员修改密码的管理。2 概要设计(1) 数据结构:a) 程序的服务员,菜单,餐桌,菜品单采用链表。每一个链表的结点存储一个结构体信息,可以灵活插入,删除,遍历和修改。b) 管理员采用结构体。因为只需要一个管理员,所以只定义一个管理员
5、结构体gly,保存管理员的编号和密码。(2) 模块划分a) 头文件 ui.h:程序使用者界面。包含 17 个 void ui 函数。b) 头文件 cpd.h:创建,浏览,查询,删除,更新菜品单。包含 8 个 void cpxx 函数和一个结构体定义。c) 头文件 file.h:打开,创建,写入,读取,关闭文件。包含 6 个 void file 函数。d) 头文件 menu.h:程序基于 ui 的功能实现。包含 20 个 void menu 函数。e) 头文件 lianbiao.h:创建,插入,浏览,删除,查询链表。包含 21 个链表实现函数。f) 主函数 main.c:包含头文件,定义程序全局
6、变量,实现程序的运行。(3) 程序总体框架mainmenuui lianbiao file cpd 3 详细设计(1) 链表实现(以服务员为例):5/服务员结构struct stud_fwyint num;/服务员编号char name20;/服务员姓名int fwgknum;/服务顾客数目char mima20;/密码struct stud_fwy *next;/链表指针;/建立服务员struct stud_fwy *jl_fwy() struct stud_fwy *charu_fwy(struct stud_fwy *head, struct stud_fwy *p);int num;i
7、nt size = sizeof(struct stud_fwy);char name20, mima20;printf(“输入您的编号:“);scanf(“%d“, printf(“输入您的姓名:“);scanf(“%s“, name);printf(“输入你的密码:“);scanf(“%s“, mima);p_fwy = (struct stud_fwy *) malloc(size);p_fwy-num = num;p_fwy-fwgknum = 0;strcpy(p_fwy-name, name);strcpy(p_fwy-mima, mima);head_fwy = charu_fw
8、y(head_fwy, p_fwy);fwydenum+;return head_fwy;/插入服务员struct stud_fwy *charu_fwy(struct stud_fwy *head, struct stud_fwy *p)struct stud_fwy *ptr, *ptr1, *ptr2;ptr2 = head;ptr = p;ptr1 = NULL;ptr1 = NULL;if (head = NULL)head = ptr;head-next = NULL;elsewhile (ptr-numptr2-num) ptr2 = ptr2-next;if (ptr-num
9、num)if (head = ptr2)head = ptr;elseptr1-next = ptr;ptr-next = ptr2;elseptr2-next = ptr;ptr-next = NULL;return head;/删除服务员struct stud_fwy *shanchu_fwy(struct stud_fwy *head, int num)struct stud_fwy *ptr1, *ptr2;while (head != NULLhead = head-next;free(ptr2);if (head = NULL)return NULL;ptr1 = head;ptr
10、2 = head-next;while (ptr2 != NULL)if (ptr2-num = num)ptr1-next = ptr2-next;free(ptr2);elseptr1 = ptr2;ptr2 = ptr1-next;return head;/遍历服务员void bianli_fwy(struct stud_fwy *head)7struct stud_fwy *ptr;if (head = NULL)printf(“n没有服务员信息,请新建!n“);return;printf(“n服务员信息:n“);printf(“编号t姓名t服务员每天服务顾客数目n“);for (pt
11、r = head; ptr != NULL; ptr = ptr-next)printf(“%dt%st%d n“, ptr-num, ptr-name, ptr-fwgknum);/查询服务员void chaxun_fwy(struct stud_fwy *head, int num)struct stud_fwy *ptr;if (head = NULL)printf(“n没有服务员信息,请新建!n“);return;for (ptr = head; ptr != NULL; ptr = ptr-next)if (ptr-num = num)printf(“n服务员信息:n“);print
12、f(“编号t姓名t服务员每天服务顾客数目n“);printf(“%dt%st%d n“, ptr-num, ptr-name,ptr-fwgknum);return;printf(“n没有编号为%d的服务员,请重试(按任意键返回)!n“, num);getchar();getchar();return;/修改服务员信息struct stud_fwy *xiugai_fwy(struct stud_fwy *head, int num)struct stud_fwy *ptr;char name20;if (head = NULL)printf(“n没有服务员信息,请新建!n“);return
13、NULL;for (ptr = head; ptr != NULL; ptr = ptr-next)if (ptr-num = num)printf(“n服务员信息:n“);printf(“编号t姓名n“);8printf(“%dt%s n“, ptr-num, ptr-name);printf(“请输入新的信息:n“);printf(“输入您的编号:“);scanf(“%d“, printf(“输入您的姓名:“);scanf(“%s“, name);ptr-num = num;strcpy(ptr-name, name);bwc();return head_fwy;printf(“n没有编号
14、为%d的服务员,请重试(按任意键返回)!n“, num);getchar();getchar();return 0;(2) 界面实现(部分)/主菜单void ui()system(“cls“);printf(“#欢迎使用#n“);printf(“主菜单:n“);printf(“ 1.管理员登陆.n“);printf(“ 2.服务员登陆.n“);printf(“ 0.退出.n“);printf(“#n“);/主菜单-管理员登陆界面void ui_glydljm()system(“cls“);printf(“#欢迎使用#n“);printf(“主菜单-管理员登陆:n“);/主菜单-管理员void
15、ui_gly()system(“cls“);printf(“#欢迎使用#n“);printf(“主菜单-管理员:n“);printf(“ 1.系统用户信息.n“);printf(“ 2.餐桌信息.n“);9printf(“ 3.菜单信息.n“);printf(“ 4.点菜情况.n“);printf(“ 5.统计分析.n“);printf(“ 6.旧账单浏览.n“);printf(“ 7.返回上一级.n“);printf(“ 0.退出.n“);printf(“#n“);/主菜单-管理员-系统用户信息void ui_gly_xtyhxx()system(“cls“);printf(“#欢迎使用#n
16、“);printf(“主菜单-管理员-系统用户信息:n“);printf(“ 1.服务员信息.n“);printf(“ 2.修改管理员密码.n“);printf(“ 3.返回上一级.n“);printf(“ 0.退出.n“);printf(“#n“);/主菜单-管理员-系统用户信息-服务员信息void ui_gly_xtyhxx_fwyxx()system(“cls“);printf(“#欢迎使用#n“);printf(“主菜单-管理员-系统用户信息-服务员信息:n“);printf(“ 1.建立.n“);printf(“ 2.删除.n“);printf(“ 3.修改.n“);printf(“
17、 4.查询.n“);printf(“ 5.浏览.n“);printf(“ 6.修改服务员密码.n“);printf(“ 7.返回上一级.n“);printf(“ 0.退出.n“);printf(“#n“);(3) 菜单实现(部分)/主菜单void menu()void menu_gly();void menu_fwy();void menu_glydl();void menu_fwydl();10int n,i;i = panduanfile();ui();printf(“输入您的选择:“);scanf(“%d“, switch (n)case 1:system(“cls“);if (i =
18、1)printf(“#欢迎使用#n“);printf(“您是第一次使用该系统,账号为1,请输入密码:“);scanf(“%s“, gly1.mima);printf(“程序退出,请重新开启!n“);bwc();getchar();getchar();exit(0);ui_glydljm();menu_glydl();menu_gly();break;case 2:if (head_fwy = NULL)system(“cls“);printf(“暂无服务员信息,请新建(按任意键返回)!n“);getchar();getchar();break;ui_fwydljm();menu_fwydl()
19、;menu_fwy();break;case 0:exit(0);default:printf(“n您的输入有误,请重新输入!n“);printf(“按任意键返回!n“);getchar();getchar();break;/主菜单-管理员登陆11void menu_glydl()int num, i = 0;char mima20;while (i #include#include#include“ui.h“#include“lianbiao.h“#include“cpd.h“#include“file.h“#include“menu.h“int main(void)while (1)15m
20、enu();return 0;4 调试分析(1) 程序前期设计不足,导致编写代码时出现各种意想不到的困难,程序函数调用混乱,没有条理,导致程序后期修复,debug 有很大的困难。(2) 菜品单功能规划时没有想到,在编写了很多代码时在加入产生混乱,导致程序杂乱无章。(3) 程序模块划分比较合理,没有产生较大的疏漏,但是这样划分导致源代码很多,有很多没有必要的东西。(4) 链表写入和读取文件时出现了重复写入的问题,后来发现是指针变量没有初始化。5 测试结果 打开程序,执行命令 1,初始化管理员密码,输入后,程序结束。打开程序,执行命令 1,输入账号,密码,执行 1 可以管理系统用户信息。打开程序,
21、执行命令 1,输入账号,密码,执行 2 可以管理餐桌信息。打开程序,执行命令 1,输入账号,密码,执行 3 可以管理菜单信息。打开程序,执行命令 1,输入账号,密码,执行 4 可以查看点菜情况。打开程序,执行命令 1,输入账号,密码,执行 5 可以统计分析。打开程序,执行命令 1,输入账号,密码,执行 6 可以查看旧账单。打开程序,执行命令 1,输入账号,密码,执行 7 可以返回上一级。打开程序,执行命令 1,输入账号,密码,执行 0 可以退出程序。打开程序,执行命令 2,进入服务员界面,执行 1 可以查看菜单信息。打开程序,执行命令 2,进入服务员界面,执行 2 可以为顾客点餐。打开程序,执
22、行命令 2,进入服务员界面,执行 3 可以计算费用。打开程序,执行命令 2,进入服务员界面,执行 4 可以查看餐桌信息。打开程序,执行命令 2,进入服务员界面,执行 5 可以返回上一级。打开程序,执行命令 2,进入服务员界面,执行 0 可以退出程序。166 课程心得总结这是第一次做超过 1000 行代码的程序,没有经验,所以前期程序的规划设计阶段没有做好,导致后期编码时出现了较多问题,各种功能间出现冲突,只能用增加代码的方式来解决这些问题,所以导致源代码很长,但是实现的功能却较少,后期 debug 时也较为困难,添加功能时也不方便,不过,这次设计的经验带给了我很大的启发,为我以后编程产生了很重要的影响,也让我明白了前期规划的重要性,尤其是做较大程序开发的时候,前期规划是非常重要的。程序虽然没有实现预想的功能,但是带给我的收益却很多。