一、设计需求:
设计一个商品销售信息管理系统,可采用链表或数组存储数据,对商品编号、名称、售价、现存数量、产地等信息进行管理。系统具有按商品编号的查找、排序以及添加(进货)、删除(卖出商品)等操作。创建的链表或数组可存储于文件中,并能从文件中读取所存储的数据。主要模块组成为:
1.录入模块
2.显示模块
3.查询模块
4.删除模块
5.修改模块
6.统计模块
7.排序模块
二、实现途径
1.采用数组存储数据。
2.编程软件:Vidual Studio 2019
三、代码功能:
1.关于商品信息的管理:编号、名称、价格、库存、类型(文具等)、进货量、出货量、进售额、出售额、利润。没有对产地信息进行管理,读者可更换类型或另加上。
2.函数Show:操作界面
3.函数input:输入商品信息
4.函数save:将数组信息保存到文本中
5.函数refer:商品信息查询
6.函数modifygoods:此代码中将修改模块和统计模块结合于该函数。修改模块功能体现在可以对商品价格进行降价或涨价,进货和出售商品。对任务中的统计模块的功能理解为对商品进货数量和出售数量进行统计,并计算进售额、出售额和该商品的利润。
7.函数delete:对商品信息进行删除
8.函数sortrank:对商品进行排序。共有三种排序模式:按编号从小到大排序,按价格从低到高进行排序,按库存数量从高到低排序。
四、代码展示:
#pragma warning(disable:4996) //防止vs2019对fopen函数的警告
#include <stdio.h>
#include <string.h> //内含strcmp函数
#include <stdlib.h> //内含exit,system函数
#define N1 20 //定义数组大小
#define N2 50 //定义结构体大小
struct commdity //声明结构体类型
{
int num; //商品编号
char name[N1]; //商品名称
float price; //商品价格
int inventory; //商品库存
char type[N1]; //商品类型
int quantity1; //商品进货量
int quantity2; //商品出售量
float sum1; //商品进售额
float sum2; //商品出售额
float profit; //商品利润
};
struct commdity com[N2], com1; //初始化结构体变量,com1为排序模块中的中间变量结构体
int Show(); //操作界面
void input(struct commdity* ps, int i); //输入函数
void save(struct commdity com[], int n); //保存数据函数
void refer(struct commdity com[]); //查询函数
void modifygoods(struct commdity com[]); //修改与统计函数
void delete(struct commdity com[]); //删除函数
void sortrank(int number); //排序函数
int main() {
int i; //普通变量
int n; //商品总共类型
int access; //操作通道口
int number; //操作5的选项操作
access = Show(); //接受操作通道值
while (access != 6) //当通道值为6时退出循环及操作6退出系统
{
if (access == 1) //操作1输入商品信息
{
printf("请输入您要输入商品的类型有几种:");
scanf_s("%d", &n);
for (i = 0; i < n; i++)
{
input(&com[i], i + 1); //向结构体中输入数据,i+1为商品编号,从1开始
}
save(com, n); //将数据保存到文件中
//回到主页面函数
system("pause"); //暂停,等待用户信号(不然控制台程序会一闪即过,
来不及看到执行结果)
system("cls"); //清屏操作
access = Show(); //操作界面函数
}
else if (access == 2) //操作2查询商品信息
{
refer(com);
system("pause");
system("cls");
access = Show();
}
else if (access == 3) //操作3修改商品信息
{
modifygoods(com);
system("pause");
system("cls");
access = Show();
}
else if (access == 4) //操作4删除商品信息
{
delete(com);
system("pause");
system("cls");
access = Show();
}
else if (access == 5) //操作5排序模块
{
printf("1----按编号从小到大进行排序\n");
printf("2----按价格从低到高进行排序\n");
printf("3----按库存数量从多到少进行排序\n");
printf("请选择操作项目:\n");
scanf_s("%d", &number);
sortrank(number);
printf("排序成功!");
system("pause");
system("cls");
access = Show();
}
}
return 0;
}
int Show() //操作界面
{
int access;
printf("*********************************\n");
printf("* 商品信息管理系统 *\n");
printf("* 1---输入商品信息 *\n");
printf("* 2---查询商品信息 *\n");
printf("* 3---修改与统计商品信息 *\n");
printf("* 4---删除商品信息 *\n");
printf("* 5---商品信息统计 *\n");
printf("* 6---退出系统功能 *\n");
printf("*********************************\n");
printf("\n");
printf("\n");
printf("请输入序号选择功能\n");
printf("请输入你的选择:");
scanf_s("%d", &access); //选择操作通道口
system("cls"); //清屏操作
return access; //返回操作通道值access
}
void input(struct commdity* ps, int i) //输入函数
{
printf("请输入第%d个商品的相关信息(编号、名称、价格、库存、类型)(用Tab键隔开):\n", i);
scanf_s("%d %s %f %d %s", &(*ps).num, (*ps).name, sizeof(com[i].name), &(*ps).price, &(*ps).inventory, (*ps).type, sizeof(com[i].type));
}
void save(struct commdity com[], int n) //保存数据函数
{
FILE* pf = fopen("Shop.txt", "a"); //以追加方式打开文件(如果文件不存在,那么创建一个新文件;如果文件存在,那么将写入的数据追加到文件的末尾(文件原有的内容保留)。)
if (pf == NULL) //判断文件是否打开成功
{
printf("读取文件失败!\n");
exit(0);
}
for (int i = 0; i < n; i++) //将结构体中的数据保存入文件中
{
com[i].quantity1 = com[i].quantity2 = 0; //对商品没有操作前进货量,出货量,进售额,出售额,利润 赋0
com[i].sum1 = com[i].sum1 = com[i].profit = 0;
fprintf(pf, "%d %s %f %d %s %d %d %0.2f %0.2f %0.2f\n", com[i].num, com[i].name, com[i].price, com[i].inventory, com[i].type, com[i].quantity1, com[i].quantity2, com[i].sum1, com[i].sum2, com[i].profit);
}
fclose(pf); //关闭文件
printf("保存商品信息成功!\n");
}
void refer(struct commdity com[]) //查询函数
{
int i; //普通变量
int num; //所要查询的商品编号
int number; //操作序号
printf("请输入序号(1--查询单个商品、2--查询全部商品):");
scanf_s("%d", &number);
if (number == 1) //操作1查询单个商品
{
printf("请输入您要查询商品的商品编号:");
scanf_s("%d", &num);
system("cls");
FILE* pf = fopen("Shop.txt", "r"); //以读取方式打开文件。只允许读取,不允许写入。文件必须存在,否则打开失败。
if (pf == NULL) //判断文件是否打开成功
{
printf("读取文件失败!\n");
exit(0);
}
for (i = 0; i < N2; i++) //从文件中读取数据
{
fscanf_s(pf, "%d %s %f %d %s %d %d %f %f %f", &com[i].num, com[i].name, sizeof(com[i].name), &com[i].price, &com[i].inventory, com[i].type, sizeof(com[i].type), &com[i].quantity1, &com[i].quantity2, &com[i].sum1, &com[i].sum2, &com[i].profit);
if (num == com[i].num)
{
printf("商品编号: %d\n", com[i].num);
printf("商品名称: %s\n", com[i].name);
printf("商品价格: %f\n", com[i].price);
printf("商品库存: %d\n", com[i].inventory);
printf("商品类型: %s\n", com[i].type);
printf("商品进货量:%d\n", com[i].quantity1);
printf("商品出售量:%d\n", com[i].quantity2);
printf("商品进售额:%0.2f\n", com[i].sum1);
printf("商品出售额:%0.2f\n", com[i].sum2);
printf("商品利润: %0.2f\n", com[i].profit);
break;
}
}
fclose(pf);
}
else if (number == 2) //查询全部商品
{
system("cls");
FILE* pf = fopen("Shop.txt", "r"); //以读取方式打开文件。只允许读取,不允许写入。文件必须存在,否则打开失败。
if (pf == NULL) //判断文件是否打开成功
{
printf("读取文件失败!\n");
exit(0);
}
for (i = 0; i < N2; i++)
{
fscanf_s(pf, "%d %s %f %d %s %d %d %f %f %f", &com[i].num, com[i].name, sizeof(com[i].name), &com[i].price, &com[i].inventory, com[i].type, sizeof(com[i].type), &com[i].quantity1, &com[i].quantity2, &com[i].sum1, &com[i].sum2, &com[i].profit);
}
printf("全部商品信息如下(商品编号、商品名称、商品价格、商品库存、商品类型、商品进货量、商品出售量、商品进售额、商品出售额、商品利润):\n");
for (i = 0; i < N2; i++)
{
if (com[i].num == 0)
{
continue;
}
printf("%d %s %f %d %s %d %d %0.2f %0.2f %0.2f\n", com[i].num, com[i].name, com[i].price, com[i].inventory, com[i].type, com[i].quantity1, com[i].quantity2, com[i].sum1, com[i].sum2, com[i].profit);
}
}
}
void modifygoods(struct commdity com[]) //修改与统计函数
{
int i, j; //普通变量
int m = 0; //修改商品的编号
int number; //操作序号
int quantity1; //进货数量
int quantity2; //出售数量
float a; //降价金额
float b; //涨价金额
FILE* pf = fopen("Shop.txt", "r"); //以读取方式打开文件。只允许读取,不允许写入。文件必须存在,否则打开失败。
if (pf == NULL) //判断文件是否打开成功
{
printf("读取文件失败!\n");
exit(0);
}
for (i = 0; i < N2; i++) //从文本中读取数据
{
fscanf_s(pf, "%d %s %f %d %s %d %d %f %f %f", &com[i].num, com[i].name, sizeof(com[i].name), &com[i].price, &com[i].inventory, com[i].type, sizeof(com[i].type), &com[i].quantity1, &com[i].quantity2, &com[i].sum1, &com[i].sum2, &com[i].profit);
}
fclose(pf);
printf("----------------------------------------------------------------\n");
printf("全部商品信息如下(商品编号、商品名称、商品价格、商品库存、商品类型、商品进货量、商品出售量、商品进售额、商品出售额、商品利润):\n");
for (i = 0; i < N2; i++)
{
if (com[i].num == 0)
{
continue;
}
printf("%d %s %f %d %s %d %d %0.2f %0.2f %0.2f\n", com[i].num, com[i].name, com[i].price, com[i].inventory, com[i].type, com[i].quantity1, com[i].quantity2, com[i].sum1, com[i].sum2, com[i].profit);
}
printf("----------------------------------------------------------------\n");
printf("请输入您要修改商品的商品编号:");
scanf_s("%d", &m);
for (i = 0; i < N2; i++)
{
if (m == com[i].num && com[i].num != 0) //所要修改的商品编号与com[i].num中的商品编号进行匹配(结构体不等于0防止结构自动补0)或者break跳出循环也可
{
printf("要修改的商品信息为:\n"); //显示所要修改的商品的信息
printf("商品编号: %d\n", com[i].num);
printf("商品名称: %s\n", com[i].name);
printf("商品价格: %f\n", com[i].price);
printf("商品库存: %d\n", com[i].inventory);
printf("商品类型: %s\n", com[i].type);
printf("商品进货量:%d\n", com[i].quantity1);
printf("商品出售量:%d\n", com[i].quantity2);
printf("商品进售额:%0.2f\n", com[i].sum1);
printf("商品出售额:%0.2f\n", com[i].sum2);
printf("商品利润: %0.2f\n", com[i].profit);
printf("--------------------------------\n");
m = i; //将修改商品编号改成对应结构体下标
}
}
printf("请输入您要修改内容(1--进货、2--出售、3--降价、4--升价)!\n");
printf("请输入序号:");
scanf_s("%d", &number);
pf = fopen("Shop.txt", "w"); //以写入方式打开文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个新文件)。
if (pf == NULL) //判断文件是否打开成功
{
printf("读取文件失败!\n");
exit(0);
}
if (number == 1) //操作1进货
{
printf("请输入您要进货的数量:");
scanf_s("%d", &quantity1);
com[m].inventory += quantity1;
com[m].quantity1 = quantity1 + com[m].quantity1;
com[m].sum1 = com[m].quantity1 * com[m].price;
}
if (number == 2) //操作2出售
{
printf("请输入您要出售的数量:");
scanf_s("%d", &quantity2);
j = com[m].inventory - quantity2; //检测库存不足函数启动值
while (j < 0) //检测库存不足函数
{
printf("库存数量不足!请重新输入你要出售的数量:");
scanf_s("%d", &quantity2);
j = com[m].inventory - quantity2;
}
com[m].inventory = j;
com[m].quantity2 = quantity2 + com[m].quantity2;
com[m].sum2 = com[m].quantity2 * com[m].price;
}
if (number == 3) //操作3降价
{
printf("请输入降价金额:");
scanf_s("%f", &a);
com[m].price -= a;
}
if (number == 4) //操作4涨价
{
printf("请输入降价金额:");
scanf_s("%f", &b);
com[m].price += b;
}
com[m].profit = com[m].sum2 - com[m].sum1;
system("cls"); //显示修改后的商品信息
printf("修改成功!\n");
printf("商品编号: %d\n", com[m].num);
printf("商品名称: %s\n", com[m].name);
printf("商品价格: %f\n", com[m].price);
printf("商品库存: %d\n", com[m].inventory);
printf("商品类型: %s\n", com[m].type);
printf("商品进货量:%d\n", com[m].quantity1);
printf("商品出售量:%d\n", com[m].quantity2);
printf("商品进售额:%0.2f\n", com[m].sum1);
printf("商品出售额:%0.2f\n", com[m].sum2);
printf("商品利润: %0.2f\n", com[m].profit);
printf("--------------------------------\n");
for (i = 0; i < N2; i++) //将修改后的商品信息存入文件中
{
if (com[i].num == 0) //结构体未被初始化部分自动补0,依次判断有效数据输入文本中后跳出循环
{
continue;
}
fprintf(pf, "%d %s %f %d %s %d %d %0.2f %0.2f %0.2f\n", com[i].num, com[i].name, com[i].price, com[i].inventory, com[i].type, com[i].quantity1, com[i].quantity2, com[i].sum1, com[i].sum2, com[i].profit);
}
fclose(pf);
}
void delete(struct commdity com[]) //删除函数
{
char name1[20] = { 0 }; //所查询商品名称待输入数组
int num1; //商品编号
int i, j, m; //普通变量
char a[5] = { 0 }; //yes或no待输入数组
char b[5] = { "yes" }, c[5] = { "no" }; //选项数组
char d[5] = "\0"; //检测数组
FILE* pf = fopen("Shop.txt", "r"); //以读取方式打开文件。只允许读取,不允许写入。文件必须存在,否则打开失败。
if (pf == NULL) //判断文件是否打开成功
{
printf("读取文件失败!\n");
exit(0);
}
for (i = 0; i < N2; i++) //从文本中读取数据
{
fscanf_s(pf, "%d %s %f %d %s %d %d %f %f %f", &com[i].num, com[i].name, sizeof(com[i].name), &com[i].price, &com[i].inventory, com[i].type, sizeof(com[i].type), &com[i].quantity1, &com[i].quantity2, &com[i].sum1, &com[i].sum2, &com[i].profit);
}
printf("请根据商品名称或商品编号删除商品信息\n");
printf("请输入序号(1--商品名称、2--商品编号):");
scanf_s("%d", &j);
printf("----------------------------------------------------------------\n"); //从文本中读取所有商品信息
printf("全部商品信息如下(商品编号、商品名称、商品价格、商品库存、商品类型、商品进货量、商品出售量、商品进售额、商品出售额、商品利润):\n");
for (i = 0; i < N2; i++)
{
if (com[i].num == 0)
{
continue; //结构体未被初始化部分自动补0,依次判断有效数据后跳出循环
}
printf("%d %s %f %d %s %d %d %0.2f %0.2f %0.2f\n", com[i].num, com[i].name, com[i].price, com[i].inventory, com[i].type, com[i].quantity1, com[i].quantity2, com[i].sum1, com[i].sum2, com[i].profit);
}
printf("----------------------------------------------------------------\n");
if (j == 1) //进入商品名称删除模块
{
printf("请输入商品名称:");
scanf_s("%s", name1, 20);
printf("--------------------------------\n");
for (i = 0; i < N2; i++)
{
if (strcmp(name1, com[i].name) == 0) //对所需要删除商品名称进行数据匹配
{
printf("要删除的商品信息为:\n"); //删除商品的信息显示
printf("商品编号: %d\n", com[i].num);
printf("商品名称: %s\n", com[i].name);
printf("商品价格: %f\n", com[i].price);
printf("商品库存: %d\n", com[i].inventory);
printf("商品类型: %s\n", com[i].type);
printf("商品进货量:%d\n", com[i].quantity1);
printf("商品出售量:%d\n", com[i].quantity2);
printf("商品进售额:%0.2f\n", com[i].sum1);
printf("商品出售额:%0.2f\n", com[i].sum2);
printf("商品利润: %0.2f\n", com[i].profit);
printf("--------------------------------\n");
m = i; //对m进行赋值,删除商品编号所对应的结构体下标
printf("请问是否要删除?\n");
printf("请输入yes或no:\n");
scanf_s("%s", a, 5);
if (strcmp(a, b) == 0) //输入yes进行删除模块
{
for (m; m < N2; m++)
{
com[m] = com[m + 1];
}
pf = fopen("Shop.txt", "w"); //以写入方式打开文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个新文件)。
if (pf == NULL) //判断文件是否打开成功
{
printf("读取文件失败!\n");
exit(0);
}
for (i = 0; i < N2; i++) //将修改后的商品信息存入文件中
{
if (com[i].num == 0) //结构体未被初始化部分自动补0,依次判断有效数据输入文本中后跳出循环
{
continue;
}
fprintf(pf, "%d %s %f %d %s %d %d %0.2f %0.2f %0.2f\n", com[i].num, com[i].name, com[i].price, com[i].inventory, com[i].type, com[i].quantity1, com[i].quantity2, com[i].sum1, com[i].sum2, com[i].profit);
}
fclose(pf);
printf("删除成功!\n");
break;
}
if (strcmp(a, c) == 0) //输入no取消删除
{
break;
}
}
}
}
if (j == 2) //进入商品编号删除模块
{
printf("请输入商品编号:");
scanf_s("%d", &num1);
printf("--------------------------------\n");
for (i = 0; i < N2; i++)
{
if (num1 == com[i].num)
{
printf("要删除的商品信息为:\n"); //删除商品信息显示
printf("商品编号: %d\n", com[i].num);
printf("商品名称: %s\n", com[i].name);
printf("商品价格: %f\n", com[i].price);
printf("商品库存: %d\n", com[i].inventory);
printf("商品类型: %s\n", com[i].type);
printf("商品进货量:%d\n", com[i].quantity1);
printf("商品出售量:%d\n", com[i].quantity2);
printf("商品进售额:%0.2f\n", com[i].sum1);
printf("商品出售额:%0.2f\n", com[i].sum2);
printf("商品利润: %0.2f\n", com[i].profit);
printf("--------------------------------\n");
m = i; //对m进行赋值,删除商品编号所对应的结构体下标
printf("请问是否要删除?\n");
printf("请输入yes或no:\n");
scanf_s("%s", a, 5);
if (strcmp(a, b) == 0) //输入yes进行删除模块
{
for (m; m < N2 - 1; m++)
{
com[m] = com[m + 1];
}
pf = fopen("Shop.txt", "w"); //以写入方式打开文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个新文件)。
if (pf == NULL) //判断文件是否打开成功
{
printf("读取文件失败!\n");
exit(0);
}
for (i = 0; i < N2; i++) //将修改后的商品信息存入文件中
{
if (com[i].num == 0) //结构体未被初始化部分自动补0,依次判断有效数据输入文本中后跳出循环
{
continue;
}
fprintf(pf, "%d %s %f %d %s %d %d %0.2f %0.2f %0.2f\n", com[i].num, com[i].name, com[i].price, com[i].inventory, com[i].type, com[i].quantity1, com[i].quantity2, com[i].sum1, com[i].sum2, com[i].profit);
}
fclose(pf);
printf("删除成功!\n");
break;
}
if (strcmp(a, c) == 0) //输入no取消删除
{
break;
}
}
}
}
fclose(pf);
}
void sortrank(int number) //排序函数
{
struct commdity com1;
int i, j;
FILE* pf = fopen("Shop.txt", "w"); //以写入方式打开文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个新文件)。
if (pf == NULL) //判断文件是否打开成功
{
printf("读取文件失败!\n");
exit(0);
}
for (i = 0; i < N2; i++) //从文本中读取数据
{
fscanf_s(pf, "%d %s %f %d %s %d %d %f %f %f", &com[i].num, com[i].name, sizeof(com[i].name), &com[i].price, &com[i].inventory, com[i].type, sizeof(com[i].type), &com[i].quantity1, &com[i].quantity2, &com[i].sum1, &com[i].sum2, &com[i].profit);
}
if (number == 1)
{
for (i = 0; i < N2 - 1; i++)
{
for (j = 0; i < N2 - 1 - i; j++)
{
if (com[j].num > com[j + 1].num && com[j + 1].num != 0)
{
com1 = com[j + 1];
com[j + 1] = com[j];
com[j] = com1;
}
if (com[j].num == 0)
{
break;
}
}
}
for (i = 0; i < N2; i++) //将修改后的商品信息存入文件中
{
if (com[i].num == 0) //结构体未被初始化部分自动补0,依次判断有效数据输入文本中后跳出循环
{
continue;
}
fprintf(pf, "%d %s %f %d %s %d %d %0.2f %0.2f %0.2f\n", com[i].num, com[i].name, com[i].price, com[i].inventory, com[i].type, com[i].quantity1, com[i].quantity2, com[i].sum1, com[i].sum2, com[i].profit);
}
fclose(pf);
}
else if (number == 2)
{
for (i = 0; i < N2 - 1; i++)
{
for (j = 0; i < N2 - 1 - i; j++)
{
if (com[j].price > com[j + 1].price && com[j + 1].num != 0)
{
com1 = com[j + 1];
com[j + 1] = com[j];
com[j] = com1;
}
if (com[j].num == 0)
{
break;
}
}
}
for (i = 0; i < N2; i++) //将修改后的商品信息存入文件中
{
if (com[i].num == 0) //结构体未被初始化部分自动补0,依次判断有效数据输入文本中后跳出循环
{
continue;
}
fprintf(pf, "%d %s %f %d %s %d %d %0.2f %0.2f %0.2f\n", com[i].num, com[i].name, com[i].price, com[i].inventory, com[i].type, com[i].quantity1, com[i].quantity2, com[i].sum1, com[i].sum2, com[i].profit);
}
fclose(pf);
}
else if (number == 3)
{
for (i = 0; i < N2 - 1; i++)
{
for (j = 0; i < N2 - 1 - i; j++)
{
if (com[j].inventory < com[j + 1].inventory && com[j + 1].num != 0)
{
com1 = com[j];
com[j] = com[j + 1];
com[j + 1] = com1;
}
if (com[j].num == 0)
{
break;
}
}
}
for (i = 0; i < N2; i++) //将修改后的商品信息存入文件中
{
if (com[i].num == 0) //结构体未被初始化部分自动补0,依次判断有效数据输入文本中后跳出循环
{
continue;
}
fprintf(pf, "%d %s %f %d %s %d %d %0.2f %0.2f %0.2f\n", com[i].num, com[i].name, com[i].price, com[i].inventory, com[i].type, com[i].quantity1, com[i].quantity2, com[i].sum1, com[i].sum2, com[i].profit);
}
fclose(pf);
}
}
代码中某些地方可能存在瑕疵,大家可对代码进行完善修改优化,提高代码的健壮性。