做了一些,还没有做完,自己加吧,睡了
C/C++code
程序代码:
#include <stdio.h>
#include <conio.h>
#include <string>
struct SELLER
{
int _id;
char _name[7];
char _sex[3];
};
struct PRODUCT{
int _id;
char _name[5];
int _price;
};
struct DATE
{
int _year;
int _month;
int _date;
};
struct SELLINFO {
int _SId;
int _PId;
struct DATE _SDate;
int _SCnt;
struct SELLINFO* _next;
};//销售员编号、产品编号、销售日期、销售数量
int product_table[5][6]={0};
SELLER seller[4];
PRODUCT product[5];
struct SELLINFO* head;
void initialization()
{
seller[0]._id=1;
strcpy(seller[0]._name,"张三丰");
strcpy(seller[0]._sex,"男");
seller[1]._id=2;
strcpy(seller[1]._name,"李四娘");
strcpy(seller[1]._sex,"女");
seller[2]._id=3;
strcpy(seller[2]._name,"王麻子");
strcpy(seller[2]._sex,"男");
seller[3]._id=4;
strcpy(seller[3]._name,"王五波");
strcpy(seller[3]._sex,"女");
product[0]._id=1;
strcpy(product[0]._name,"铁锅");
product[0]._price=2;
product[1]._id=2;
strcpy(product[1]._name,"铝飘");
product[1]._price=3;
product[2]._id=3;
strcpy(product[2]._name,"钢盔");
product[2]._price=4;
product[3]._id=4;
strcpy(product[3]._name,"银筷");
product[3]._price=5;
product[4]._id=5;
strcpy(product[4]._name,"美女");
product[4]._price=1;
}
void print()
{
printf("\t********************************************************\n");
printf("\t******销售统计系统v0.001******date:2011.06.09***********\n");
printf("\t********************************************************\n");
printf("\t本单位销售人员:\n");
for(int i=0;i<4;i++)
{
printf("\t %d %s %s \n",seller[i]._id,seller[i]._name,seller[i]._sex);
}
printf("\n") ;
printf("\t本单位销售产品:\n");
for(int i=0;i<5;i++)
{
printf("\t %d %s %d \n",product[i]._id,product[i]._name,product[i]._price);
}
printf("\n") ;
}
bool IsDate(int yy,int mm,int dd)
{
if(yy<2000 || yy>2020 || mm<1 || mm>12 || dd<1 || dd>31) return false;
switch(mm)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
if(dd>31) return false;
case 4: case 6: case 9: case 11:
if(dd>30) return false;
case 2:
if(0==yy%4 && 0!=yy%yy || 0==yy%400) //闰年
{
if(mm>29) return false;
}
else //非闰年
{
if(mm>28) return false;
}
}
return true;
}
bool check_SId(int SId) //检测销售员编号,存在返回true
{
for(int i=0;i<4;i++)
if(SId==seller[i]._id) return true;
return false;
}
bool check_PId(int PId)//检测产品编号,存在 返回true
{
for(int i=0;i<5;i++)
if(PId==product[i]._id) return true;
return false;
}
int check(int SId,int PId,char date[],int cnt)
{
if (!check_SId(SId)) return 1 ;
if (!check_PId(PId)) return 2;
int yy,mm,dd;//年月日整数
yy=(date[0]-48)*1000+(date[1]-48)*100+(date[2]-48)*10+(date[3-48]);//断网了,办公室查不到把字串转换成整数的函数,只好用笨办法
mm=(date[5]-48)*10+(date[6]-48);
dd=(date[8]-48)*10+(date[9]-48);
if( !( 10==strlen(date) && //日期长度为10
'-'==date[4] && '-'==date[7] && //第四、八位为-
IsDate(yy,mm,dd) //三个数据能够成日期
) )//如果不能形成日期返回3
return 3;
if(! cnt>0) return 4;
return 0;
}
void add_to_list(int SId,int PId,char date[],int cnt)
{
if( NULL==head )//链表未建立
{
//creat_list
head=(struct SELLINFO*)malloc(sizeof(struct SELLINFO));
head->_SId=SId;
head->_PId=PId;
head->_SDate._year=(date[0]-48)*1000+(date[1]-48)*100+(date[2]-48)*10+(date[3-48]);
head->_SDate._month=(date[5]-48)*10+(date[6]-48);
head->_SDate._date=(date[8]-48)*10+(date[9]-48);
head->_SCnt=cnt;
head->_next=NULL;
}
else //已经建立链表
{
//insert_list 在结尾;
struct SELLINFO* p,* n;
p=head;
n=head->_next;
while(n!=NULL)
{
p=n;
n=p->_next;
}
p->_next=n=(struct SELLINFO*)malloc(sizeof(struct SELLINFO));
n->_SId=SId;
n->_PId=PId;
n->_SDate._year=(date[0]-48)*1000+(date[1]-48)*100+(date[2]-48)*10+(date[3-48]);
n->_SDate._month=(date[5]-48)*10+(date[6]-48);
n->_SDate._date=(date[8]-48)*10+(date[9]-48);
n->_SCnt=cnt;
n->_next=NULL;
}
}
void input()
{
int SellId;
int ProId;
static char date[11];
int SellCnt;
bool flag = true;
printf("\t箐输入销售信息(销售员编号 产品编号 销售日期 销售数量)\n");
printf("\t请用一个空格间隔,日期格式例:2011-01-01\n\n");
while(flag)
{
//system("cls");
printf("\tscstlg=>");
scanf("%d%d%s%d",&SellId,&ProId,&date,&SellCnt);
switch(check(SellId,ProId,date,SellCnt))
{
case 0:
add_to_list(SellId,ProId,date,SellCnt);//加入链表
printf("\t继续输入吗?如果结束,请按n,如果继续输入按任意键\n");
char ch=getchar();
if(ch=='n')
flag=false;//退出循环
break;
case 1:
printf("\t销售员编号输入有错,请重新输入\n");
break;
case 2:
printf("\t产品编号输入有错,请重新输入\n");
break;
case 3:
printf("\t销售日期输入有错,请重新输入\n");
break;
case 4:
printf("\t销售数量输入有错,请重新输入\n");
break;
default:
printf("\t输入数据不符规范,程序出现未知错误,即将退出!");
getch();
exit(-1);
}
}
}
//统计报表
void pro_table(char date1[],char date2[])
{
int pyy,pmm,pdd,nyy,nmm,ndd;
pyy=(date1[0]-48)*1000+(date1[1]-48)*100+(date1[2]-48)*10+(date1[3-48]);
pmm=(date1[5]-48)*10+(date1[6]-48);
pdd=(date1[8]-48)*10+(date1[9]-48);
nyy=(date2[0]-48)*1000+(date2[1]-48)*100+(date2[2]-48)*10+(date2[3-48]);
nmm=(date2[5]-48)*10+(date2[6]-48);
ndd=(date2[8]-48)*10+(date2[9]-48);
struct SELLINFO* n(head);
//把链表数据读入数组
while(n!=NULL)
{
//在时间范围内的话
if(n->_SDate._year>=pyy && n->_SDate._month>=pmm && n->_SDate._date>=pdd &&
n->_SDate._year<=nyy && n->_SDate._month<=nmm && n->_SDate._date<=ndd )
{
product_table[n->_SId][n->_PId]+=n->_SCnt;
}
n=n->_next;
}
//计算数组统计
for(int i=0;i<4;i++)
for(int j=0;j<5;j++)
product_table[i][5]+=product_table[i][j];
for(int i=0;i<6;i++)
for(int j=0;j<4;j++)
product_table[4][i]+=product_table[j][i];
}
void out_table()
{
system("cls");
printf("\t********************************************************\n");
printf("\t******销售统计系统v0.001******date:2011.06.09***********\n");
printf("\t********************************************************\n");
printf("\t\n");
printf("\t 产品 | 1 | 2 | 3 | 4 | 总和 \n");
printf("\t人员 | | | | | \n\t");
for (int i=0;i<5;i++)
{
printf("%d ",i);
for(int j=0;j<6;j++)
printf(" %d |",product_table[i][j]);
printf("\n\t");
}
}
void query()
{
char date1[11];
char date2[11];
printf("\t输入要查询的时间范围,两时间用一个空格分开;\n时间格式:yyyy-mm-dd yy-mm-dd\n");
printf("\t\scstlg=>");
scanf("%s%s",date1,date2);
pro_table(date1,date2);
out_table();
}
int main()
{
initialization();
print();
input();
query();
return 0;
}