#include<stdio.h>
#include <string.h>
#include<stdlib.h>
//销售信息
struct Sales{
int year; //年
int month; //月
int day; //日
char name[5]; //销售人姓名
char xnum[9]; //销售人编号
float sale; //销售额
};
//销售信息列表
struct Slist{
struct Sales* data;
int ys;//列表有效元素
int rs;//列表当前最大容量
} ;
//初始化销售信息
void cs_xs(struct Slist* xs);
//检查销售信息
void check_xs(struct Slist* xs);
//添加销售信息
void tj_xs(struct Slist* xs);
//删除销售信息
void sc_xs(struct Slist* xs);
//修改销售信息
void xg_xs(struct Slist* xs);
//查找销售信息
void cz_xs(const struct Slist* xs);
//保存销售信息
void save_xs(struct Slist* xs);
//加载销售信息
void jz_xs(struct Slist* xs);
//显示全部销售信息
void show_xs(struct Slist* xs);
void menu()
{
printf("****************************************\n");
printf("------------1.添加销售信息--------------\n");
printf("------------2.删除销售信息--------------\n");
printf("------------3.修改销售信息--------------\n");
printf("------------4.查找销售信息--------------\n");
printf("------------5.显示销售信息--------------\n");
printf("------------6.保存销售信息--------------\n");
printf("------------0.返回上一界面--------------\n");
printf("****************************************\n");
}
int main()
{
int input = 0;
//创建一个销售列表
struct Slist list;
//初始化销售列表
cs_xs(&list);
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
tj_xs(&list);
break;
case 2:
sc_xs(&list);
break;
case 3:
xg_xs(&list);
break;
case 4:
cz_xs(&list);
break;
case 5:
show_xs(&list);
break;
case 6:
//保存信息
save_xs(&list);
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
//初始化销售信息
void cs_xs(struct Slist* xs)
{
xs->ys = 0;
//最多可以放3条销售信息,空间不够,可以增容
xs->data = (struct Slist*)malloc(3 * sizeof(struct Slist));
xs->rs = 3;
//加载文件信息到通讯录中
jz_xs(xs);
}
//加载销售信息
void jz_xs(struct Slist* xs)
{
//打开文件
FILE* pf = fopen("sale.txt", "rb");
if (NULL == pf)
{
perror("LoadSale::fopen");//打印出错误信息
return;
}
//读文件
struct Sales temp = { 0 };
while (fread(&temp, sizeof(struct Sales), 1, pf))
{
//空间不够的话,得增加空间
check_xs(xs);
xs->data[xs->ys] = temp;
xs->ys++;
}
//关闭文件
fclose(pf);
pf = NULL;
}
//添加销售信息
void tj_xs(struct Slist* xs)
{
check_xs(xs);
//录入添加的销售信息
do
{
printf("请输入销售人编号:>");
scanf("%s", xs->data[xs->ys].xnum);
}
while (strlen(xs->data[xs->ys].xnum)!=8);
printf("请输入销售人姓名:>");
scanf("%s", xs->data[xs->ys].name);
do
{
printf("请输入销售日期:>");
scanf("%d%d%d", &xs->data[xs->ys].year,&xs->data[xs->ys].month,&xs->data[xs->ys].day);
}
while(xs->data[xs->ys].month<-0||xs->data[xs->ys].month>=12||xs->data[xs->ys].day<=0||xs->data[xs->ys].day>=31);
printf("请输入销售金额:>");
scanf("%f", &xs->data[xs->ys].sale);
xs->ys++;
printf("添加成功\n");
}
//检查销售信息
void check_xs(struct Slist* xs)
{
if (xs->ys == xs->rs)
{
//增加容量
struct Sales* sa = (struct Sales*)realloc(xs->data, (xs->rs + 2)*sizeof(struct Sales));
if (sa != NULL)
{
xs->data = sa;
xs->rs += 2;
printf("增容成功\n");
}
else
{
perror("增容失败");
exit(1);
}
}
}
//显示销售列表全部信息
void show_xs(struct Slist* xs)
{
int i = 0;
printf("%15s\t%15s\t%10s\t%15s\t%10s\t%10s\n\n", "xnum", "name", "year", "month", "day","sale");
for ( i = 0; i < xs->ys; i++)
{
printf("%15s\t%15s\t%10d\t%15d\t%10d\t%10.2f\n",xs->data[i].xnum, xs->data[i].name, xs->data[i].year,xs->data[i].month,xs->data[i].day,xs->data[i].sale);
}
}
//按收银员编号寻找
int FindSalesByXnum(const struct Slist* xs,char xnum[])
{
int i = 0;
for ( i = 0; i < xs->ys; i++)
{
if (strcmp(xs->data[i].xnum, xnum) == 0)
{
return i;
}
}
return -1;
}
//删除销售信息
void sc_xs(struct Slist* xs)
{
if (xs->ys == 0)
{
printf("销售信息为空,无法删除\n");
return;
}
char xnum[9] = {0};
printf("请输入要删除销售信息的销售人编号:>");
scanf("%s", xnum);
//查找
int cz = FindSalesByXnum(xs, xnum);
if (cz == -1)
{
printf("指定的销售人编号不存在\n");
}
else
{
//删除
int j = 0;
for ( j = cz; j < xs->ys - 1; j++) //把要删除元素的所有后面的元素往前移动1
{
xs->data[j] = xs->data[j + 1];
}
xs->ys--;
printf("删除成功\n");
}
}
//查找销售信息
void cz_xs(const struct Slist* xs)
{
char xnum[9] = { 0 };
printf("输入要查找销售信息销售人的编号");
scanf("%s", xnum);
int cz = FindSalesByXnum(xs, xnum);
if (-1 == cz)
{
printf("查无此销售信息\n");
}
else
{
printf("%15s\t%15s\t%10s\t%15s\t%10s\t%10s\n\n", "xnum", "name","year","month","day", "sale");
for (cz = 0; cz < xs->ys; cz++)
{
printf("%15s\t%15s\t%10d\t%15d\t%10d\t%10.2f\n\n", xs->data[cz].xnum, xs->data[cz].name, xs->data[cz].year,xs->data[cz].month,xs->data[cz].day,xs->data[cz].sale);
}
}
}
//修改销售信息
void xg_xs(struct Slist* xs)
{
char xnum[9] = { 0 };
printf("输入要修改销售信息的销售人编号");
scanf("%s", xnum);
int cz = FindSalesByXnum(xs, xnum);
if (-1 == cz)
{
printf("要修改的销售信息不存在\n");
}
else
{
printf("请输入新的收银员编号:>");
scanf("%s", xs->data[cz].xnum);
printf("请输入收银员姓名:>");
scanf("%s", xs->data[cz].name);
printf("请输入销售日期:>");
scanf("%d%d%d", &xs->data[xs->ys].year,&xs->data[xs->ys].month,&xs->data[xs->ys].day);
printf("请输入销售金额:>");
scanf("%f", &xs->data[xs->ys].sale);
}
}
//保存销售信息
void save_xs(struct Slist* xs)
{
//打开文件
FILE* pf = fopen("sale.txt", "wb");//以二进制的形式写
if (pf == NULL)
{
perror("SaveSale::fopen");
return;
}
//写数据
for (int i = 0; i < xs->ys; i++)
{
fwrite(xs->data + i, sizeof(struct Sales), 1, pf);
}
//关闭文件
fclose(pf);
pf = NULL;
}
因为某种原因,权限不够
第11行 12行修改如下:
//销售信息
struct Sales {
int year; //年
int month; //月
int day; //日
char name[16]; //销售人姓名 char name[5]; 修改
char xnum[10]; //销售人编号 char xnum[9];修改
float sale; //销售额
};
第105行修改如下:
//初始化销售信息
void cs_xs(struct Slist* xs)
{
xs->ys = 0;
//最多可以放3条销售信息,空间不够,可以增容
xs->data = (struct Sales*)malloc(3 * sizeof(struct Sales)); //修改
//xs->data = (struct Slist*)malloc(3 * sizeof(struct Slist));
xs->rs = 3;
//加载文件信息到通讯录中
jz_xs(xs);
}