急!!团购信息管理系统c++作业。。。。。(追加分)

程序设计题一:团购网站信息管理系统
【课题内容和要求】
团购站每天推出一单精品消费,包括餐厅,KTV,电影院,健身馆等精选特色商家,凑够最低团购人数就可享受无敌折扣。按照商家给出的最低消费要求,团购站酌情添加金额赚取其中的差价利润。本系统要求对某团购站信息和收益进行统计和分析。通过此课题,熟练掌握数组、指针的各种操作,以及一些算法思想的应用。
(1)团购信息包括:
团购类型(主要可以分为饮食,美容,健身,养生,电影票,)
商户信息(如商户名称,联系电话,地点)
金额,最低参团人数,实际团购人数,消费时间.
(2)需要实现的功能
1)用户根据口令进入系统;
2按照不同团购类型,设定利润差价;
3 对给定时间段(如一周)进行收益统计;
4显示某时间段内的团购信息表,内容应包括类型,金额,人数等;
5按团购类型进行收益的分类统计和排序;
6显示按团购类型排序后的支出信息;
7将排序后的内容存为文件。
(3)界面友好,输入信息符合逻辑如存款金额不为负数、不可能有非数字的字符等。
或者给点思路也行啊 T^T。。。。。。。。。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define PF printf
#define SF scanf
#define N 100

struct user // 定义结构体
{
int number;
char a[4];
int time;
};
typedef struct user user;
user us[N]; // 定义全局可用的结构体数组

void menu()
{
PF("\t\t**************团购信息管理系统欢迎您**************\n");
PF("\t\t*\t\t|1.管理员登录 *\n");
PF("\t\t*\t\t|0.退出 *\n");
PF("\t\t**************团购信息管理系统欢迎您**************\n\n");
}

void administrator()
{
PF("\t\t*****************团购信息管理系统*****************\n");
PF("\t\t*\t\t|1.团购信息录入 *\n");
PF("\t\t*\t\t|2.团购信息浏览 *\n");
PF("\t\t*\t\t|3.团购信息查询 *\n");
PF("\t\t*\t\t|4.团购信息的添加 *\n");
PF("\t\t*\t\t|5.团购信息的删除 *\n");
PF("\t\t*\t\t|0.退出系统 *\n");
PF("\t\t*****************团购信息管理系统*****************\n\n\n");
PF("\t\t请输入以上序号进行选择:");
}

void display()
{
PF("\n\t\t*******************团购信息查询*******************\n");
PF("\t\t*\t\t|1.团购信息表 *\n");
PF("\t\t*\t\t|2.团购利润排序统计 *\n");
PF("\t\t*\t\t|3.团购支出排序统计 *\n");
PF("\t\t*\t\t|0.返回主菜单 *\n");
PF("\t\t*******************团购信息查询*******************\n\n\n");
PF("\t\t请输入以上序号进行选择:");
}

void checkID() // 检验用户名
{
char c[6];
PF("\t\t请输入用户名:");
while(1)
{
SF("%s",c);getchar();
if(c[0]=='a'&&c[1]=='d'&&c[2]=='m'&&c[3]=='i'&&c[4]=='n'&&c[5]=='\0')
break;
PF("\t\t用户名错误,请重新输入:");
}
}

void password(int p) // 检验密码
{
int n=0;
while(p!=123456)
{
n++;
if(n==1)
PF("\t\t密码错误,您还有两次输入机会:");
if(n==2)
PF("\t\t密码错误,您还有一次输入机会:");
if(n==3)
exit(0);
scanf("%d",&p);
}
PF("\n");
}

int tongji(int i,int c,int d,int m) // 输入起始和结束时间筛选出各项在该时间段内的个数
{
int k=0,n;
for(n=0;n<m;n++)
{
if(us[n].time>=c&&us[n].time<=d)
{
if(us[n].a[i]=='y')
k++;
}
}
return k;
}

void xinxi(int n) // 这个输出最全的团购信息,但是不排序,不保存
{
int b[4],c,d,i,k=0;
PF("\n\t\t请输入起始时间:");
SF("%d",&c);
PF("\t\t请输入结束时间:");
SF("%d",&d);
for(i=0;i<=3;i++) // 执行统计子函数,将各项在时间段内的个数存到b[0]、b[1]、b[2]、b[3]中
{
b[k]=tongji(i,c,d,n);
k++;
}
PF("\n 类型 商户名称 地点 电话 最低人数 ");
PF(" 实际人数\t收入\t支出\t利润\n");
PF(" 电影 A 北京 13211111111 2 ");
PF(" %d\t %d\t %d\t %d\n",b[0],b[0]*100,b[0]*85,b[0]*15); // 制表符后加空格才有用
PF("健身房 B 上海 13622222222 3 ");
PF(" %d\t %d\t %d\t %d\n",b[1],b[1]*150,b[1]*130,b[1]*20);
PF(" 餐厅 C 南京 13733333333 2 ");
PF(" %d\t %d\t %d\t %d\n",b[2],b[2]*200,b[2]*175,b[2]*25);
PF(" 宾馆 D 杭州 13844444444 3 ");
PF(" %d\t %d\t %d\t %d\n",b[3],b[3]*250,b[3]*220,b[3]*30);
PF("\n\t\t\t总计:\t 收入\t 支出\t利润\t\n");
PF("\t\t\t \t %d\t %d\t %d\t\n",b[0]*100+b[1]*150+b[2]*200+b[3]*250,b[0]*85+b[1]*130+b[2]*175+b[3]*220,b[0]*15+b[1]*20+b[2]*25+b[3]*30);
PF("\n");
}

void lirun(int n)// 将各项利润按由大到小排序
{
FILE *fp=fopen("D:\\lirun.txt","w"); // 定义一个文件指针,新建并将指针指向文件
int b[4],c,d,i,k=0,s,temp,l,index,t=0;
char *t1="\t\t\t\t类型 \t利润\n",*t2="\t\t\t\t电影 ",*t3="\t\t\t\t健身房",*t4="\t\t\t\t总计 ",*t5="\t\t\t\t餐厅 ",*t6="\t\t\t\t宾馆 ",*t7="\t\t\t\t起始时间:",*t8="\t\t\t\t结束时间:";
char len1,len2,len3,len4,len5,len6;
struct f // 定义结构体数组,用来存放利润和标记项目的数字
{
int y,z;
} f[4];
PF("\n\t\t请输入起始时间:");
SF("%d",&c);
PF("\t\t请输入结束时间:");
SF("%d",&d);
for(i=0;i<=3;i++) // 执行统计子函数,将各项在时间段内的个数存到b[0]、b[1]、b[2]、b[3]中
{
b[k]=tongji(i,c,d,n);
k++;
}
f[0].z=b[0]*15;f[0].y=0;
f[1].z=b[1]*20;f[1].y=1;
f[2].z=b[2]*25;f[2].y=2;
f[3].z=b[3]*30;f[3].y=3;
s=f[0].z+f[1].z+f[2].z+f[3].z;
PF("\n\t\t\t\t类型 \t利润\n");
for(l=0;l<3;l++) // 将存于f[l].z中的数按有大到小的顺序排序并保存,并将标记相应项目的数字交换
{
index=l;
for(t=l+1;t<4;t++)
if(f[t].z>f[index].z)
index=t;
if(index!=l)
{
temp=f[index].z;
f[index].z=f[l].z;
f[l].z=temp;
temp=f[index].y;
f[index].y=f[l].y;
f[l].y=temp;
}
}
len1=strlen(t1); // 将想要输出的文段所占空间长度测出,以便之后的文本输出
len2=strlen(t2);
len3=strlen(t3);
len4=strlen(t4);
len5=strlen(t7);
len6=strlen(t8);
fwrite(t7,len5,1,fp); // 将文段输入到fp所指的文档中
fprintf(fp,"%d\n",c);
fwrite(t8,len6,1,fp);
fprintf(fp,"%d\n\n",d);
fwrite(t1,len1,1,fp);
for(l=0;l<4;l++) // 将统计信息输出到屏幕并保存为文件
{
if(f[l].y==0)
{
PF("\t\t\t\t电影 ");PF("\t %d\n",f[l].z);
fwrite(t2,len2,1,fp);fprintf(fp,"\t%d\n",f[l].z);
}
if(f[l].y==1)
{
PF("\t\t\t\t健身房");PF("\t %d\n",f[l].z);
fwrite(t3,len3,1,fp);fprintf(fp,"\t%d\n",f[l].z);
}
if(f[l].y==2)
{
PF("\t\t\t\t餐厅 ");PF("\t %d\n",f[l].z);
fwrite(t5,len2,1,fp);fprintf(fp,"\t%d\n",f[l].z);
}
if(f[l].y==3)
{
PF("\t\t\t\t宾馆 ");PF("\t %d\n",f[l].z);
fwrite(t6,len2,1,fp);fprintf(fp,"\t%d\n",f[l].z);
}
}
PF("\t\t\t\t总计 ");PF("\t %d\n\n",s);
fwrite(t4,len4,1,fp);fprintf(fp,"\t%d\n",s);
fclose(fp);
}

void zhichu(int n)// 将支出由大到小排序
{
FILE *fp=fopen("D:\\zhichu.txt","w"); // 定义一个文件指针,新建并将指针指向文件
int b[4],c,d,i,k=0,s,temp,l,index,t=0;
char *t1="\t\t\t\t类型 \t支出\n",*t2="\t\t\t\t电影 ",*t3="\t\t\t\t健身房",*t4="\t\t\t\t总计 ",*t5="\t\t\t\t餐厅 ",*t6="\t\t\t\t宾馆 ",*t7="\t\t\t\t起始时间:",*t8="\t\t\t\t结束时间:";
char len1,len2,len3,len4,len5,len6;
struct f // 定义结构体数组,用来存放利润和标记项目的数字
{
int y,z;
} f[4];
PF("\n\t\t请输入起始时间:");
SF("%d",&c);
PF("\t\t请输入结束时间:");
SF("%d",&d);
for(i=0;i<=3;i++) // 执行统计子函数,将各项在时间段内的个数存到b[0]、b[1]、b[2]、b[3]中
{
b[k]=tongji(i,c,d,n);
k++;
}
f[0].z=b[0]*85;f[0].y=0;
f[1].z=b[1]*130;f[1].y=1;
f[2].z=b[2]*175;f[2].y=2;
f[3].z=b[3]*220;f[3].y=3;
s=f[0].z+f[1].z+f[2].z+f[3].z;
PF("\n\t\t\t\t类型 \t支出\n");
for(l=0;l<3;l++) // 将存于f[l].z中的数按有大到小的顺序排序并保存,并将标记相应项目的数字交换
{
index=l;
for(t=l+1;t<4;t++)
if(f[t].z>f[index].z)
index=t;
if(index!=l)
{
temp=f[index].z;
f[index].z=f[l].z;
f[l].z=temp;
temp=f[index].y;
f[index].y=f[l].y;
f[l].y=temp;
}
}
len1=strlen(t1); // 将想要输出的文段所占空间长度测出,以便之后的文本输出
len2=strlen(t2);
len3=strlen(t3);
len4=strlen(t4);
len5=strlen(t7);
len6=strlen(t8);
fwrite(t7,len5,1,fp); // 将文段输入到fp所指的文档中
fprintf(fp,"%d\n",c);
fwrite(t8,len6,1,fp);
fprintf(fp,"%d\n\n",d);
fwrite(t1,len1,1,fp);
for(l=0;l<4;l++) // 将统计信息输出到屏幕并保存为文件
{
if(f[l].y==0)
{
PF("\t\t\t\t电影 ");PF("\t %d\n",f[l].z);
fwrite(t2,len2,1,fp);fprintf(fp,"\t%d\n",f[l].z);
}
if(f[l].y==1)
{
PF("\t\t\t\t健身房");PF("\t %d\n",f[l].z);
fwrite(t3,len3,1,fp);fprintf(fp,"\t%d\n",f[l].z);
}
if(f[l].y==2)
{
PF("\t\t\t\t餐厅 ");PF("\t %d\n",f[l].z);
fwrite(t5,len2,1,fp);fprintf(fp,"\t%d\n",f[l].z);
}
if(f[l].y==3)
{
PF("\t\t\t\t宾馆 ");PF("\t %d\n",f[l].z);
fwrite(t6,len2,1,fp);fprintf(fp,"\t%d\n",f[l].z);
}
}
PF("\t\t\t\t总计 ");PF("\t %d\n\n",s);
fwrite(t4,len4,1,fp);fprintf(fp,"\t%d\n",s);
fclose(fp);
}

void chaxun(int n) // 这是核心功能,团购信息查询
{
int choice;
do
{
display();
scanf("%d",&choice);
switch(choice)
{
case 1:xinxi(n);
break;
case 2:lirun(n);
break;
case 3:zhichu(n);
break;
case 0: break;
default : PF("\t\t\t\t 请重新输入!\n\n");
break;
}
}while(choice);
PF("\n");
}

int luru() // 录入函数
{
int n=0;
while(1)
{
char ch;
PF("\n\t\t~~~~~~~~~~~~~~~开始输入信息~~~~~~~~~~~~~\n");
PF("\t\t请输入客户编号:");getchar();
SF("%d",&us[n].number);PF("\n");
PF("\t\t请输入电影,健身房,餐厅,宾馆的订购情况(y/n):");getchar(); // 此步千万不能少,少了整个程序完全崩溃
SF("%c,%c,%c,%c",&(us[n].a[0]),&(us[n].a[1]),&(us[n].a[2]),&(us[n].a[3]));PF("\n");getchar();
PF("\t\t请输入购物时间:");
SF("%d",&us[n].time);PF("\n");getchar(); // 两次输入之间回车作为保护,否则下次输入跳过
n++;
PF("\t\t是否继续输入,请选择(y/n):");
SF("%c",&ch);
if(ch=='n')
break;
}
PF("\n");
return n;
}

void liulan(int n) // 此部分验证正确
{
int k;
PF("\n\t\t客户编号 电影 健身房 餐厅 宾馆 消费时间\n");
for(k=0;k<n;k++)
{
PF("\t\t ");
PF("%d",us[k].number);
PF("\t ");PF("%c",us[k].a[0]);
PF("\t ");PF("%c",us[k].a[1]);
PF("\t ");PF("%c",us[k].a[2]);
PF("\t ");PF("%c",us[k].a[3]);
PF("\t");PF("%d",us[k].time);
PF("\n");
}
PF("\n");
}

int tianjia(int n)
{
while(1)
{
char ch;
PF("\n\t\t请输入客户编号:");
SF("%d",&(us[n].number));getchar(); // 跳过回车
PF("\t\t此客户订购电影吗? ");
SF("%c",&(us[n].a[0]));getchar();
PF("\t\t此客户订购健身房吗? ");
SF("%c",&(us[n].a[1]));getchar();
PF("\t\t此客户订购餐厅吗? ");
SF("%c",&(us[n].a[2]));getchar();
PF("\t\t此客户订购宾馆吗? ");
SF("%c",&(us[n].a[3]));getchar();
PF("\t\t请输入此客户的订购时间:");
SF("%d",&(us[n].time));getchar();
n++;
PF("\t\t还要再次输入吗?(y/n) ");
SF("%c",&ch);
if(ch=='n')
break;
}
PF("\n");
return n;
}

int shanchu(int n)
{
int i,t,f=0,k,l=0;
while(1)
{
char ch;
int c=0;
if(f==0)
PF("\n\t\t请输入需要删除的客户编号:");
SF("%d",&t);getchar(); // 输入客户编号不能出现字符,否则输出时出错!
for(i=0;i<n-l;i++)
{
k=i;
if(us[i].number==t)
{
c=1;
f=1;
break;
}
}
if(c==0)
{
PF("\t\t输入有误,请重新输入客户编号!\n\n");
continue;
}
l++;
for(i=k;i<n-l;i++)
{
us[i].number=us[i+1].number;
us[i].a[0]=us[i+1].a[0];
us[i].a[1]=us[i+1].a[1];
us[i].a[2]=us[i+1].a[2];
us[i].a[3]=us[i+1].a[3];
us[i].time=us[i+1].time;
}
PF("\t\t还要再删除吗?(y/n) ");
SF("%c",&ch);
if(ch=='n')
break;
f=0;
}
PF("\n");
return n-l;
}

void runmain() // 这是次主体结构
{
int choice,n=0;
do
{
choice=6;getchar();
administrator();
scanf("%d",&choice);
switch(choice)
{
case 1:n=luru();
break;
case 2:liulan(n);
break;
case 3:chaxun(n);
break;
case 4:n=tianjia(n);
break;
case 5:n=shanchu(n);
break;
case 0: exit(0);
default : PF("\t\t\t\t 请重新输入!\n\n");
break;
}
}while(choice);
}

int main() // 这是主体结构
{
int choice,p;
system("color F9");
do
{
menu();
PF("\t\t\t\t\t");
scanf("%d",&choice);
if(choice==1)
{
checkID();
printf("\t\t请输入登录密码:");
scanf("%d",&p);
password(p);
runmain ( );
}
if(choice!=0&&choice!=1)
printf("\t\t\t\t 请重新输入!\n\n");
}while(choice);
return 0;
}
温馨提示:答案为网友推荐,仅供参考
相似回答