好想知道这个关于餐馆点菜的程序哪里出错了,运行时只能进入管理员账户无法创建新用户进入主管和服务员页面

qq_41894002 2018-07-10 10:20:53
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>

int k = 0;//订单号
int t = 0;//菜单菜目数量
int y = 0;//已经结账的用户数量
int cans = 5;//餐桌的初始
int ps = 3;//人员

struct node//存储文件里的信息
{
char name[5], pwd[5];
char num ;
} ls[1000];

struct cai//菜的信息
{
char name[10];
int num;
char caiz, caih;
double p;
int f;
} caid[1000];

struct no
{
char name[10];
int fen;
int num;
double p;
};

struct jiezhang//订单信息
{
char name[15];
int s;//菜的个数
int zuohao;//桌号
double m;//总金额
char huo;//状态
char zd;//订单是否买单
struct no us[1000];
} lk[1000];

struct zuo//台桌信息
{
char zt;
char hd;
int h;
} lz[100];

struct ns
{
char name[15];
double sum;
} ly[1000];

void admin();//管理员模块
void denglu();//登陆页面
void director();//经理模块
void waiter();//服务员模块
void denglu();//登陆模块
void canzhuo();//餐桌页面
void caidan();//菜单的增删
int caiq(int d);//寻找某个编号的菜;
void diancai();//点菜
void canzuog();//餐桌改变
void renyuang();//人员管理
char str[26];

int main()
{
FILE *fp;
int i;
char ch;
printf("系统初始化******\n");
printf("初始化完成.\n");
if((fp = fopen("d:\\user.dat","ab+")) == NULL)
{
printf("Cannot Open !!!\n");
exit(0) ;
}
for(i = 0; i < 5; i++)//台桌信息初始化
{
lz[i].zt = 'Y';
lz[i].hd = 'Y';
lz[i].h = i;
}
ch = fgetc(fp);
if(ch == EOF)
{
printf("创建新的111 111的管理员用户\n");
strcpy(ls[0].name,"111");
strcpy(ls[0].pwd,"111");
ls[0].num = 'a';
char cc[25] = {'1','1','1',' ','1','1','1',' ','a'};
fputs(cc,fp);
}
else
{
rewind(fp);
for(i = 0; i < 1000; i++)
{
fgets(str,25,fp);
sscanf(str,"%s %s %c",ls[i].name,ls[i].pwd,&ls[i].num);//数据解析

}
}
fclose(fp);
denglu();
}

char name[5], pwd[5];

void denglu()//登陆页面
{

int i;
system("CLS");
printf("+----------------------------+\n");
printf("+ +\n");
printf("+ 易用点菜系统 +\n");
printf("+ CopyRight +\n");
printf("+ +\n");
printf("+----------------------------+\n");
printf("请输入用户名>");//读入数据
scanf("%s",name);
printf("请输入密码>");
scanf("%s",pwd);
char c = '0';
for(i = 0; i < 1000; i++)
{
if((strcmp(name,ls[i].name) == 0) && (strcmp(pwd,ls[i].pwd) ==0))
{
c = ls[i].num;
break;
}
}
if(c == 'a')//管理员模块调用
{
admin();
}
else if(c == 'd')//主管模块调用
{
director();
}
else if(c == 'w')//服务员模块的调用
{
waiter();
}
else //没有此用户
{
printf("登录失败!!!\n");
}

}

void admin()//管理页面
{
system("CLS");
printf("+------- -------+\n");
printf("+--- ---+\n");
printf("+--- 管理页面 ---+\n");
printf("+--- ---+\n");
printf("+------- -------+\n");
printf(" 1 : 菜谱管理\n");
printf(" 2 : 餐桌管理\n");
printf(" 3 : 人员管理\n");
printf(" c : 切换用户\n");
printf(" q : 退出系统\n");
printf(" 输入你的选择 >");
char c;
scanf("%s",&c);
if(c == '1')//菜谱页面
{
caidan();
admin();
}
else if(c == '2')//餐桌管理
{
canzuog();
}
else if(c == '3')
{
renyuang();
}
else if(c == 'q')//切换用户
{
denglu();
}
else if(c == 'c')//退出系统
{
denglu();
}

}

void director()//主管页面
{
system("CLS");
printf("+------- -------+\n");
printf("+--- ---+\n");
printf("+--- 主管页面 ---+\n");
printf("+--- ---+\n");
printf("+------- -------+\n");
printf(" 1 : 营销统计\n");
printf(" 2 :\n");
printf(" 3 :\n");
printf(" c : 切换用户\n");
printf(" q : 退出系统\n");
printf(" 输入你的选择 >");
//getchar();
char c;
scanf("%s",&c);
if(c == '1')
{
int i;
double sum = 0;
printf("用户 营业额\n");
for(i = 0; i < y; i++)
{
printf("%s %.2lf\n",ly[i].name,ly[i].sum);
sum += ly[i].sum;
}
printf("总计 %.2lf\n",sum);
system("pause");
director();
}
else if(c == 'c')
{
denglu();
}
else if(c == 'q')
{
denglu();
}
}

int caiq(int d)//寻找某个编号的菜
{
int i;
for(i = 0; i < t; i++)
{
if(caid[i].num == d)
{
break;
}
}
printf("菜号 菜名 价格 状态 是否活动\n");
printf("%d %s %.2lf %c %c\n",caid[i].num,caid[i].name,caid[i].p,caid[i].caiz,caid[i].caih);
return i;
}

void caidan()//菜目的增删改查
{
system("CLS");
printf("+------- -------+\n");
printf("+--- ---+\n");
printf("+--- 菜单页面 ---+\n");
printf("+--- ---+\n");
printf("+------- -------+\n");
printf(" 1 -> 增加菜目\n");
printf(" 2 -> 删除菜目\n");
printf(" 3 -> 修改菜目\n");
printf(" 4 -> 查询菜目\n");
printf(" 5 -> 所有菜目\n");
printf(" q -> 返 回\n");
printf(" 输入你的选择 >");
//getchar();
char c;
scanf("%s",&c);
if(c == '1') //增加菜目
{
printf("输入菜目编号:");
scanf("%d",&caid[t].num);
printf("输入菜目名称:");
scanf("%s",caid[t].name);
printf("输入菜目价格:");
scanf("%lf",&caid[t].p);
//getchar();
printf("输入菜目状态<Y/N>:");
scanf("%s",&caid[t].caiz);
caid[t].f = 1;
printf("输入菜目活动<Y/N>:");
//getchar();
scanf("%s",&caid[t++].caih);
printf("是否确认添加<Y/N>:");
char u;
scanf("%s",&u);
if(u == 'N')
{
t--;
}
system("pause");
caidan();
}
else if(c == '2')//删除菜目
{
printf("输入要删除的菜号\n");
int d;
printf("1.输入菜号>");
scanf("%d",&d);
int i = caiq(d);
printf("是否删除<Y/N>>");
char mm;
//getchar();
scanf("%s",&mm);
printf("\n");
if(mm == 'Y')
{
caid[i].f = 0;
}
system("pause");
caidan();
}
else if(c == '4')
{
printf("输入要查询的菜号\n");
printf("1.输入菜号>");
int d;
scanf("%d",&d);
int i ;
i = caiq(d);
system("pause");
caidan();
}
else if(c == '5')
{
int i;
for(i = 0; i < t; i++)
{
if(caid[i].f == 1)
{
printf("菜号 菜名 价格 状态 是否活动\n");
printf("%d %s %.2lf %c %c\n",caid[i].num,caid[i].name,caid[i].p,caid[i].caiz,caid[i].caih);
}
}
system("pause");
caidan();
}
else if(c == '3')//修改菜目信息
{
printf("请输入要修改菜目的编号");
int d;
scanf("%d",&d);
d = caiq(d);
int num;
char gname[15];
double pp;
char caiz, caih;
printf("输入菜目编号:");
scanf("%d",&num);
printf("输入菜目名称:");
scanf("%s",gname);
printf("输入菜目价格:");
scanf("%lf",&pp);
//getchar();
printf("输入菜目状态<Y/N>:");
scanf("%s",&caiz);
printf("输入菜目活动<Y/N>:");
//getchar();
scanf("%s",&caih);
printf("是否确认修改<Y/N>:");
char u;
scanf("%s",&u);
if(u == 'Y')//修改完成
{
printf("修改完成,请继续!\n");
caid[d].num = num;
strcpy(caid[d].name,gname);
caid[d].p = pp;
caid[d].caiz = caiz;
caid[d].caih = caih;
}
system("pause");
caidan();
}
}

void diancai()//点菜
{
int i;
printf("订单号 桌号 菜数 已买单 活动 用户名\n");
for(i = 0; i < k; i++)
{
printf("%d %d %d %c %c %s\n",i+1,lk[i].zuohao,lk[i].s,lk[i].zd,lk[i].huo,lk[i].name);
}
printf("输入要点菜的订单号\n");
int d;
scanf("%d",&d);
d = d-1;
printf("这是菜单\n");
int j;
printf("菜号 菜名 价格 状态 是否活动\n");
for(j = 0; j < t; j++)
{
if(caid[j].f == 1)
{
printf("%d %s %.2lf %c %c\n",caid[j].num,caid[j].name,caid[j].p,caid[j].caiz,caid[j].caih);
}
}
printf("这是你订单的已点菜\n");
for(j = 0; j < lk[d].s; j++)
{
printf("%d %s %.2lf %d\n",lk[d].us[j].num,lk[d].us[j].name,lk[d].us[j].p,lk[d].us[j].fen);
}
printf("输入菜号>");
int r;
scanf("%d",&r);//要点菜的编号
r = caiq(r);
lk[d].us[lk[d].s].num = caid[r].num;
strcpy(lk[d].us[lk[d].s].name,caid[r].name);
lk[d].us[lk[d].s].p = caid[r].p;
int p;//要点菜的份数
printf("输入份数>");
scanf("%d",&p);
lk[d].us[lk[d].s].fen = p;
int ll;
ll = p;
printf("是否确认点菜<Y/N>?>");
char e;
scanf("%s",&e);
if(e == 'Y')
{
lk[d].s++;
lk[d].m += ll*caid[r].p;
}
printf("是否继续点菜<Y/N>>");
scanf("%s",&e);
if(e == 'Y')
{
diancai();
}
else
{
system("pause");
waiter();
}

}

void waiter()//服务模块
{
system("CLS");
printf("+------- -------+\n");
printf("+--- ---+\n");
printf("+--- 服务页面 ---+\n");
printf("+--- ---+\n");
printf("+------- -------+\n");
printf(" 1 : 开 桌\n");
printf(" 2 : 点 菜\n");
printf(" 3 : 查询台桌\n");
printf(" 4 : 点菜记录\n");
printf(" 5 : 查询订单\n");
printf(" 6 : 买 单\n");
printf(" c : 切换用户\n");
printf(" q : 退出系统\n");
printf("输入你的选择 >");
char c;
//getchar();
scanf("%s",&c);
if(c == '1')//开桌
{
int i;
printf("桌号 状态 是否活动\n");
for(i = 0; i < 5; i++)
{
printf("%d %c %c\n",lz[i].h,lz[i].hd,lz[i].zt);
}
printf("输入要选择的台桌>");
int d;
scanf("%d",&d);
printf("确认选择吗<Y/N>");
char ci;
scanf("%s",&ci);
if(ci == 'Y')//订单的初始化
{
lz[d].zt = 'N';
strcpy(lk[k].name,name);
lk[k].s = 0;
lk[k].huo = 'Y';
lk[k].m = 0;
lk[k].zd = 'N';
lk[
...全文
120 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-07-10
  • 打赏
  • 举报
回复
printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
//自动跳过一个或多个空格或Tab字符或回车换行,读取下一个字符。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧