一、课题内容和要求
1、问题描述
编写一份简化的食堂自动化管理系统,实现学生就餐卡管理和菜品管理以及消费记录统计等相关功能。所有数据包括学生就餐卡信息,菜品信息等都要利用文件系统保存,以备系统下次运行时使用。通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些基本算法的应用。
2、功能要求
(1)学生就餐卡和菜品数据是由多条数据记录构成,其信息包括:
学生就餐卡:卡号,姓名,余额,状态(正常和挂失。)
食堂菜品数据:编号 名称 金额 消费次数
(2)数据保存形式:
所有就餐卡信息,菜品信息数据要以文本或二进制文件保存。
(3)需要实现的功能
代码要能提供以下两个基本模块。
管理员模块:
管理员以密码登录系统,可以完成以下功能
A. 注册学生就餐卡
B.就餐卡的充值挂失模块
C.食堂菜单管理功能,包括对菜单的增删修改查等功能。
学生模块:
以就餐卡号登录系统(说明:卡处于挂失,则拒绝登录。)
可以查询卡中余额。
可以查询本卡的消费记录(选做)
可以浏览菜品并按照金额购买
(4)界面功能要求:
A.采用友好的字符界面,实现一个功能控制菜单。
B.每次操作都从该菜单选择,利用循环结构使得一次运行程序可进行多次操作。
选做要求:
(1)数据完整性保证。例如:就餐卡号和菜单编号不得重复。
(2)学生每次消费可以自动生成消费记录(卡号,购买时间,购买菜品编号,购买金额)。该消费记录表永久保存,用于事后查询和统计。具体请学生自己构思、设计。
二、需求分析
食堂自动化管理系统的功能框架图如图所示。
(1) 提供可操作的主菜单:输出菜单,用于显示以从文件中加载的主菜单信息和若干个可选的功能选项。根据客户输入的选项来进入不同的模式,运行不同的函数。流程操作如下图所示。
(2)程序入口与多级菜单显示:在主菜单下,根据用户输入的不同选择,进入各级菜单,进而调用不同的函数,实现不同的功能。
(3)数据结构体的设计与初始化:在程序一开始就将自动构建各类用户结构体的实例,并且构造实例,为不同用户提供服务。在用户进行不同的选择时,会读入不同的数据信息,来构建具体的结构体实例,以满足用户需求。
(4)用户信息存储:在程序一始,会将相关数据结构自动初始化置空。在用户使用非存储类功能时,将不会对相关数据信息进行任何更改,也不涉及对文件内容的读写操作;当用户使用设计相关信息存储的功能时,将会从文件中按需写入相关信息到结构体中,在使用完毕后,再次进行信息的存储。如果是仅涉及存储,不涉及更改已存入信息功能的函数,将限制其使用文件的权限,已达到相关数据安全的保障。
(5)面向不同用户的功能协调:本程序设计了两种不同的用户模式:管理员模式与学生模式;程序的主入口是一致的,都将由用户来选择进入任何一种模式继续运行,两种模式都是采用一定的检测手段来进行登录使用,如下图所示。
三、概要设计
主要存储结构
// 代码很烂,轻喷。注:仅供参考学习使用。
//主要存储结构
//================ 结构体 ================
struct Student{
char card_num[20]; //卡号
char name[20];//姓名
char money[20];//余额
char mode[2];//状态
};
typedef struct Student student;//别名student
struct Food{
char id[20];
char name[20];
char price[20];
char num[10];
};
typedef struct Food food;//和student内容相似
struct Record{
char stu_id[20];
char food_id[20];
char food_price[20];
char record_time[255];
};
typedef struct Record record;//和student内容相似
四、源程序代码
// 代码很烂,轻喷。注:仅供参考学习使用。
//头文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
//全局变量定义
#define USER_FILE "user.txt"
#define RECORD_FILE "record.txt"
#define FOOD_FILE "food.txt"
#define CONSOLE "CON"
#define BUFLEN 255
#define NUM 50
#define password 123
//================ 结构体 ================
struct Student{
char card_num[20]; //卡号
char name[20];//姓名
char money[20];//余额
char mode[2];//状态
};
typedef struct Student student;//别名student
struct Food{
char id[20];
char name[20];
char price[20];
char num[10];
};
typedef struct Food food;//和student内容相似
struct Record{
char stu_id[20];
char food_id[20];
char food_price[20];
char record_time[255];
};
typedef struct Record record;//和student内容相似
//================ 函数声明 ================
//主函数
int main(void);
//重启函数
void rerun();
//主菜单显示
int menu();
//结构体内容初始化
void init(student *stu,food *fd,record *re);
//从文件读入学生卡信息
void readfile(student *stu);
//从文件读入菜品信息
void readfood(food *fd);
//从文件读入记录信息
void readrecord(record *re);
//保存学生信息
void savefile(student *stu);
//保存食物信息
void savefood(food *fd);
//保存记录信息
void saverecord(record *re);
//管理模式
void admin_mode(student *stu,food *fd);
//管理模式菜单
int admin_menu();
//注册学生卡
void regist();
//充值
void charge(student *stu);
//挂失
void report_of_loss(student *stu);
//解挂
void hanging_solutions(student *stu);
//注销
void del(student *stu);
//录入菜品
void input(food *fd);
//查询菜品
void check(food *fd);
//统计功能 (打印所有菜品信息)
void count(food *fd);
//学生模式
void stu_mode(student *stu,food *fd,record *re);
//学生模式菜单
int stu_menu();
//查余额
void surplus(student *stu,char *num);
//消费记录
void sturecord(record *re,char *num);
//购物
void purchase(student *stu,food *fd,char *num);
//================ 程序辅助功能实现 ================
//结构体内容初始化
void init(student *stu,food *fd,record *re){
for(int i = 0; i<NUM;i++){
strcpy(stu[i].card_num,"");
strcpy(stu[i].name,"");
strcpy(stu[i].money,"");
strcpy(stu[i].mode,"");
}
for(int i = 0; i<NUM;i++){
strcpy(fd[i].id,"");
strcpy(fd[i].name,"");
strcpy(fd[i].price,"");
strcpy(fd[i].num,"");
}
for(int i = 0; i<BUFLEN;i++){
strcpy(re[i].stu_id,"");
strcpy(re[i].food_id,"");
strcpy(re[i].food_price,"");
strcpy(re[i].record_time,