【求助】销售管理
问题描述:已知一公司某公司有4 个销售员(编号、姓名、性别),负责销售 5 种产品(产品代号、产品名
称,销售价格)。设计一程序,完成以下功能:
1) 从键盘输入销售信息:销售员编号、产品编号、销售日期、销售数量(输入时需要判断销
售员编号是否存在、产品编号是否存在、销售数量是否大于 0,销售日期日期格式是否合法(格式为:YYYY-MM-DD,如 2009-01-02)))
2) 能输出指定时间段内的销售统计报表,格式如下:
销售统计报表
产品代号
1 2 3 4 5
销售员代号 销售之和
1
2
3
4
每种产品之和 总和
3) 根据销售员编号查询销售历史情况
4) 能删除指定销售员、产品、销售日期的记录
提示:
* 定义一个日期结构体保存日期,具体信息为:年、月、日
* 判断销售日期的格式是否合法时,需要判断长度是否为 10,第5 位和第8 位是否为’-’,
字符,将 1-4 位表示的年份,6-7 位表示的月份,9-10 位表示的日期分别转换成整数。判
断是否满足构成日期的条件闰年月份只能是 1-12 之间的数,如果是闰年,二月可以是 29
天否则不能大于 28,1,3,5,7,8,10,12 月可以是 31 天,其余只能小于等于 30(建
议写成函数)。
* 定义一个结构体数组保存 4 个销售员信息,具体信息为:编号、姓名、性别
* 定义一个结构体数组保存 5 种产品信息,具体信息为:产品代号、产品名称,销售价格
* 定义一个链表保存销售信息,信息为:销售员编号、产品编号、销售日期、销售数量。每
输入一比销售信息时,在该链表中插入一条记录
* 输入销售信息时需要查询销售员数组和产品数组,是否在该销售员和产品
* 实现第二个功能(销售统计报表)时,需要定义一个二维数组 report(5 行 6 列)来保存报
表信息,遍历销售链表,如果销售日期大于开始统计时间小于结束统计时间,判断其销售
员代号在销售员数组中的下标 m,以及产品代号在产品数组中的下标,并将该销售数量累
加在 report[m][n]元素中,再输入该二维数组
下面是我自己写的,可运行的时候有几个模块不能正常运行,希望大家没事试试,然后给点意见。
主要是新建销售信息记录void create();和文件保存 void load();求高手指点修改一下。小弟在此谢过!!
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include <stdlib.h>
#include<conio.h>
#define NULL 0
#define LEN sizeof(struct worker)
#define LON sizeof(struct product)
/*结构体定义*/
struct date{
char year[4];
char month[3];
char day[3];
};
struct product
{
char id[2];
int dm ;
char mc[20];
int num;
float price;
struct date d;
struct product *next;
};
typedef struct worker
{ char id1[2];
char name[10];
char sex[10];
struct worker *next;
};
/*函数声明*/
void createRec(); /*新建销售员记录*/
void create(); /*新建销售信息记录*/
void load(); /*文件保存销售信息记录*/
void searchRec(); /*查询销售信息记录*/
void insertRec(); /*插入销售信息记录*/
void deleteRec(); /*删除销售员记录*/
void listRec(); /*显示所有销售信息*/
void keep(); /*记录报表的函数*/
int judge_date();
void huiexit(); /*退 出*/
int menu_select(); /*主菜单*/
struct worker *head1=NULL,*p1,*p2,*p3;/*定义结构体指针head 为头指针,p1 为输入数据缓存空间指针,p2 为尾指针*/
struct product *head=NULL, *pt1,*pt2,*pt3;
/*主函数*/
int main()
{ for(;;)
{ switch(menu_select())
{
case 1: system("cls"); createRec();break;
case 2: system("cls"); create(); break;
case 3: system("cls"); load(); break;
case 4: system("cls"); searchRec();break;
case 5: system("cls"); insertRec();break;
case 6: system("cls"); deleteRec();break;
case 7: system("cls"); listRec(); break;
case 8: system("cls"); keep(); break;
case 0: system("cls"); huiexit(0); return 0;
default :{ getchar();
printf("\n 选择错误,请正确输入你的选择(0~8),:\n");
printf("\n 按任意键返回......\n");
getchar();
system("cls"); /*清屏*/
}
}
}
return 0;
}
/*主菜单*/
int menu_select()
{ int c;
printf("\t\t**************菜单**************\n");
printf("\t\t\t1.新建销售员记录\n");
printf("\t\t\t2.新建销售信息记录\n");
printf("\t\t\t3.文件输入销售信息\n");
printf("\t\t\t4.查询销售员记录\n");
printf("\t\t\t5.插入销售员记录\n");
printf("\t\t\t6.删除销售员记录\n");
printf("\t\t\t7.显示所有信息\n");
printf("\t\t\t8.记录报表的函数\n");
printf("\t\t\t0.退出\n");
printf("\t\t********************************\n");
printf("\n 输入你的选择(0~8):\n");
scanf("%d",&c);
return c;
}
/*新建销售员记录*/
void createRec()
{ int n,i;
if(head!=0)
{
getchar();
printf("\n 销售员信息数据库已建立,按任意键返回......:\n");
getchar();
getchar();
system("cls"); /*清屏*/
return;
}
printf("\n\n 请输入希望建立的销售员基本信息条数n(n>1&&n<5):\n");
do{
scanf("%d",&n);
if(n<1||n>5)
printf("\n\n输入范围有误,请重新输入希望建立的销售员基本信息条数n(n<1&&n<5):\n");
}while(n<1||n>5);
/*开始建立n条销售员基本信息记录*/
printf("\n 销售员号 姓名 性别(male、female) \n ");
head1=p1=(struct worker *)malloc(LEN); /*开辟一个新单元*/
p1->next =NULL;
for(i=0;i<n;i++)
{
scanf(" %s %s %s", p1->id1,p1->name,p1->sex);
p2=(struct worker *)malloc(LEN); /*开辟一个新单元*/
p1->next =p2;
p3=p1;
p1=p2;
p1->next =NULL;
}
free(p2);
p3->next=NULL;
printf("\n n项信息输入完毕,按任意键返回......\n");
getchar();
getchar();
system("cls"); /*清屏*/
}
/*新建销售信息记录*/
void create()
{ int n,i;
if(head!=0)
{
getchar();
printf("\n 销售信息数据库已建立,按任意键返回......:\n");
getchar();
system("cls"); /*清屏*/
return;
}
printf("\n\n 请输入希望建立的销售基本信息条数n(n>1&&n<10):\n");
do{
scanf("%d",&n);
if(n<1||n>10)
printf("\n\n输入范围有误,请重新输入希望建立的销售基本信息条数n(n<1&&n<5):\n");
}while(n<1||n>10);
/*开始建立n条销售员基本信息记录*/
printf("\n 销售员号 产品代码(1-5) 产品名称 产品数量 价格 销售时间 \n ");
head=pt1;
pt1=(struct product *)malloc(LON); /*开辟一个新单元*/
pt1->next =NULL;
for(i=0;i<n;i++)
{
scanf("%s %d %s %d %f %s%s%s", pt1->id,&pt1->dm,pt1->mc,&pt1->num,&pt1->price,pt1->d.year,pt1->d.month,pt1->d.day);
while(judge_date(head))
{
printf("请继续输入信息!");
scanf("%s %d %s %d %f %s%s%s", pt1->id,&pt1->dm,pt1->mc,&pt1->num,&pt1->price,pt1->d.year,pt1->d.month,pt1->d.day);
}
pt2=(struct product *)malloc(LON); /*开辟一个新单元*/
pt1->next =pt2;
pt3=pt1;
pt1=pt2;
pt1->next =NULL;
}
free(pt2);
pt3->next=NULL;
printf("\n n项信息输入完毕,按任意键返回......\n");
getchar();
system("cls"); /*清屏*/
}
/*文件保存销售信息记录 */
void load(struct product *head)
{
FILE *fp;
struct product *p;
if((fp=fopen("D:\\xinxi.txt","w"))==NULL)
{
printf("can not open the file!\n");
exit(0);
}
p=head;
while(p!=NULL)
{
fprintf(fp,"销售员编号 产品编号 产品名称 销售数量 产品价格 销售日期 \n");
fscanf(fp,"%s%d%s%d%f%s%s%s",p->id,&p->dm,p->mc,&p->num,&p->price,p->d.year,p->d.month,p->d.day);
p=p->next;
}
printf("数据全部保存!");
fclose(fp);getchar();getchar();
system("cls");
}
/*查询销售信息记录*/
void searchRec(struct product *head)
{ struct product *pp;
char id[10];
pp=head;
printf("\n\n 请输入销售员号以便查证:\n");
scanf("%s",id);
while(pp!=NULL)
{ if(strcmp(pp->id,id )==0)
{ printf("\t该销售员信息如下:\n\t 销售员号:");
printf("%s\n",pp->id );
printf("\t 产品的代码:");
printf("%d\n",pp->dm );
printf("\t 产品名称:");
printf("%s\n",pp->mc );
printf("\t 销售数量:");
printf("%d\n",pp->num );
printf("\t 产品的价格:");
printf("%f\n",pp->price );
printf("\t 销售时间:");
printf("%s%s%s\n",pp->d.year,pp->d.month,pp->d.day );
break;
}
else {pp=pp->next ;}
}
if(pp==NULL) printf("\n\n找不到该销售员信息!!!\n");
printf("\n 按任意键返回......\n");
getch();
system("cls"); /*清屏*/
}
/*插入销售员记录*/
void insertRec()
{int n=0,m,i;
pt1=head;
if(head==NULL) { /*空数据库插入在第一个位置*/
getchar();
printf("\n 销售员信息数据库为空,只能插入第一个位置,按任意键将继续。:\n");
getchar();
printf("\n\n 销售员号 产品代码、产品名称、数量、价格、销售时间的形式输入销售员记录:\n");
head=(struct product *)malloc(LEN); /*开辟一个新单元*/
head->next =NULL;
scanf("%s%d%s%d%f%s%s%s", pt1->id,&pt1->dm,pt1->mc,&pt1->num,&pt1->price,pt1->d.year,pt1->d.month,pt1->d.day);
while(judge_date(head))
{
scanf("%s%d%s%d%f%s%s%s", pt1->id,&pt1->dm,pt1->mc,&pt1->num,&pt1->price,pt1->d.year,pt1->d.month,pt1->d.day);
printf("请继续输入信息!");
}
printf("\n信息输入完毕,按任意键返回......\n");
getchar();
system("cls"); /*清屏*/
return;
}
/*数据库不为空时,分插入第一个位置,中间位置,最后一个位置三种情况*/
do{
n++;
pt1=pt1->next;
}while(pt1!=0);
printf("销售员信息数据库中共有%d条记录,请输入插入的位置n:\n",n);
do{ scanf("%d",&m);
if(m<1||m>n+1) printf("\n\n 输入范围有误,请重新输入希望插入的正确位置(n>=1&&n<=%d):\n",n+1);
}while(m<1||m>n+1);
if(m==1) { /*插入在数据库的第一个位置*/
pt1=head;
getchar();
printf("\n\n 销售员号 产品代码、产品名称、数量、价格、销售时间的形式输入销售员记录:\n");
head=(struct product *)malloc(LEN); /*开辟一个新单元*/
scanf("%s%d%s%d%f%s%s%s", head->id,&head->dm,head->mc,&head->num,&head->price,head->d.year,head->d.month,head->d.day);
while(judge_date(head))
{
scanf("%s%d%s%d%f%s%s%s", head->id,&head->dm,head->mc,&head->num,&head->price,head->d.year,head->d.month,head->d.day);
printf("请继续输入信息!");
}
head->next =pt1;
printf("\n1项信息输入完毕,按任意键返回......\n");
getchar();
system("cls"); /*清屏*/
return;
}
if(m==n+1) { /*插入在数据库的最后一个位置*/
pt1=head;
while( pt1->next!=NULL)
pt1=pt1->next;
printf("\n\n 请按销售员号(id<=2位) 销售员姓名的形式输入1条销售员记录:\n");
p2=(struct worker *)malloc(LEN); /*开辟一个新单元*/
scanf("%s%d%s%d%f%s%s%s",pt2->id,&pt2->dm,pt2->mc,&pt2->num,&pt2->price,pt2->d.year,pt2->d.month,pt2->d.day);
while(judge_date(head))
{
scanf("%s%d%s%d%f%s%s%s", pt2->id,&pt2->dm,pt2->mc,&pt2->num,&pt2->price,pt2->d.year,pt2->d.month,pt2->d.day);
printf("请继续输入信息!");
}
pt2->next=NULL;
pt1->next=pt2;
printf("\n1项信息输入完毕,按任意键返回......\n");
getchar();
system("cls"); /*清屏*/
return;
}
/*插入在数据库的中间第n个位置*/
pt1=head;
for(i=1;i<m;i++)
{ pt2=pt1;
pt1=pt1->next;
}
printf("\n\n 请按销售员号(id<=2位) 销售员姓名的形式输入1条销售员记录:\n");
pt3=(struct product *)malloc(LEN); /*开辟一个新单元*/
scanf("%s%d%s%d%f%s%s%s",pt3->id,&pt3->dm,pt3->mc,&pt3->num,&pt3->price,pt3->d.year,pt3->d.month,pt3->d.day);
while(judge_date(head))
{
scanf("%s%d%s%d%f%s%s%s", pt3->id,&pt3->dm,pt3->mc,&pt3->num,&pt3->price,pt3->d.year,pt3->d.month,pt3->d.day);
printf("请继续输入信息!");
}
pt3->next=pt1;
pt2->next=pt3;
printf("\n1项信息输入完毕,按任意键返回......\n");
getchar();
system("cls"); /*清屏*/
return;
}
/*删除指定销售员号的记录*/
void deleteRec()
{
char id[2];
if(head==NULL)
{ getchar();
printf("\n 销售员信息数据库为空,不能删除,按任意键将返回:\n");
getchar();
system("cls"); /*清屏*/
return;
}
pt1=head;
printf("\n\n请输入要删除的销售员号:\n");
scanf("%s",id);
while(strcmp(id,pt1->id )!=NULL&&p1->next!=NULL)
{ p2=p1;
pt1=pt1->next ;
}
if(strcmp(id,pt1->id )==NULL)
{ if(head->next==NULL)
{ free(head);
head=NULL;
}
else if(head==pt1)
{ head=pt1->next;
free(pt1);
}
else{ pt2->next=pt1->next;
free(pt1);
}
printf("\n删除完毕,");
}
else
printf("\n\n找不到该销售员号信息!");
getchar();
printf("按任意键将返回:\n");
getchar();
system("cls"); /*清屏*/
return;
}
/*显示所有信息*/
void listRec()
{
if(head==NULL)
{
printf("\n数据库中没有销售信息,按任意键返回。\n");
getch(); system("cls"); return;
}
printf("\n全部销售信息如下:\n");
printf("\n 销售员号 产品代码 产品名称 数量 价格 销售时间\n");
pt1=head;
while(p1!=NULL)
{
printf(" %s %d %s %d %f %s%s%s", pt1->id,pt1->dm,pt1->mc,pt1->num,pt1->price,pt1->d.year,pt1->d.month,pt1->d.day);
p1=p1->next;
}
printf("\n按任意键返回!......\n");
getch();
system("cls"); /*清屏*/
}
/*输入时间的判断*/
int judge_date(struct product *head)
{
struct product *p=head;
int flag=0;
int i,j;
i=atoi(p->d.year);
j=(i%4==0&&i%100==0||i%400==0);
if(p->d.month[0]!='-'||p->d.day[0]!='-')
{
printf("日期输入有误,请重新输入:\n");
flag=1;
return flag;
}
else
if((p->d.day[1]>='3'&&p->d.day[2]>'1')||(p->d.month[1]=='0'&&p->d.month[2]=='2'&&p->d.day[2]>'8'&&p->d.day[1]=='2'&&j==0))
{
printf("日期输入有误,请重新输入:\n");
flag=1;
return flag;
}
else
if((p->d.month[1]>'1')||((p->d.month[2]>'2')&&(p->d.month[1])==1))
{
printf("月份输入有误,请重新输入:\n");
flag=1;
return flag;
}
return flag;
}
/*记录报表的函数*/
void keep(struct product *head)
{
int bao[5][6];
int i,j;
FILE *fp;
if((fp=fopen("e:\\xinxi.txt","w"))==NULL)
{
printf("文件无法打开!\n");
exit(0);
}
fprintf(fp," 销售信息 \n");
fprintf(fp,"销售员代号 1 2 3 4 5 销售之和\n");
for(j=0;j<4;j++)
{
fprintf(fp,"%d",j+1);
for(i=0;i<6;i++)
{
fscanf(fp,"%d",&bao[j][i]);
bao[j][5]+=bao[j][i];
}
fprintf(fp,"%d\n",bao[j][5]);
}
fprintf(fp,"每种产品的和:");
for(i=0;i<6;i++)
{
for(j=0;j<5;j++){
bao[4][j]+=bao[i][j];
fprintf(fp,"%d",bao[4][j]);
}
if(fclose(fp)){
printf("文件无法关闭!\n");
exit(0);
}
printf("\n 按任意键返回\n");
getchar();getchar();
system("cls");
}
}
/*退出*/
void huiexit()
{
pt1=head;
while( p1!=NULL)
{
pt2=pt1->next;
free(pt1);
pt1=pt2;
}
}