#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX_PRODUCTS 50
#define MAX_RECORDS 50
// 商品库存结构体
struct ProductInventory {
char name[50]; //商品名称
int quantity; //商品库存数量
};
// 商品进销记录结构体
struct SalesRecord {
int product_id; //进销编号
char name[10]; //商品名称
char transaction_type[10]; // 进销类型,可以是进货或销售
float unit_price; //商品单价
int quantity; //商品数量
char date[12]; //进销日期
char note[20]; //备注
};
struct ProductInventory inventory[MAX_PRODUCTS]; //库存量数组
int inventory_count = 0; //库存数据条数
struct SalesRecord records[MAX_RECORDS]; //进销记录数组
int records_count = 0; //进销记录条数
//打印商品库存信息表格
void printInventoryTable() {
int i;
// 打印表头
printf("%-10s %-10s\n", "商品名称", "库存数量");
printf("-----------------------\n");
// 打印每条库存信息
for (i = 0; i < inventory_count; ++i) {
printf("%-10s %-10d\n", inventory[i].name, inventory[i].quantity);
}
}
// 辅助函数:检查商品编号是否重复
int isProductIDDuplicate(int product_id) {
int i;
for (i = 0; i < records_count; ++i) {
if (records[i].product_id == product_id) {
return 1; // 商品编号重复
}
}
return 0; // 商品编号不重复
}
// 辅助函数定义:检查日期格式是否正确
int isValidDateFormat(const char *date) {
int i;
if (strlen(date) != 10) {
return 0; // 日期长度不符合
}
// 检查每个字符是否符合日期格式要求
for (i = 0; i < 10; ++i) {
if (i == 4 || i == 7) {
if (date[i] != '-') {
return 0; // 位置为年份或月份分隔符不是 '-'
}
} else {
if (!isdigit(date[i])) {
return 0; // 不是数字
}
}
}
return 1; // 格式正确
}
// 辅助函数:根据商品名称查找库存信息索引
int findInventoryIndex(const char *name) {
int i;
for (i = 0; i < inventory_count; ++i) {
if (strcmp(inventory[i].name, name) == 0) {
return i; // 找到该商品名称,返回索引
}
}
return -1; // 没有找到该商品名称
}
// 添加进销记录到数组中
void addSalesRecord() {
int flag=0;
char answer[10];
do {
// 检查数组是否已满
if (records_count >= MAX_RECORDS) {
printf("错误: 进销记录数组已满,无法添加新记录。\n");
return;
}
struct SalesRecord newRecord;
// 用户输入新记录的信息
printf("请输入记录编号: ");
scanf("%d", &newRecord.product_id);
// 检查商品编号是否重复
if (isProductIDDuplicate(newRecord.product_id)) {
printf("错误: 商品编号 %d 已经存在,请输入唯一的商品编号。\n", newRecord.product_id);
return;
}
printf("请输入商品名称: ");
scanf("%s", newRecord.name);
int inventoryIndex = findInventoryIndex(newRecord.name);
// 输入进销类型,并检查是否为有效类型
printf("请输入进销类型 (进货/销售): ");
scanf("%s", newRecord.transaction_type);
// 若商品库存数组中不存在该商品,则无法销售
if (inventoryIndex == -1) {
printf("错误,商品库存不存在该商品,无法销售\n");
return;
}
// 检查进销类型是否为有效类型
if (strcmp(newRecord.transaction_type, "进货") != 0 && strcmp(newRecord.transaction_type, "销售") != 0) {
printf("错误: 进销类型只能是 '进货' 或 '销售',添加记录失败。\n");
return;
}
printf("请输入商品单价: ");
scanf("%f", &newRecord.unit_price);
printf("请输入商品数量: ");
scanf("%d", &newRecord.quantity);
// 销售操作,检查库存是否足够
if (strcmp(newRecord.transaction_type, "销售") == 0&&inventory[inventoryIndex].quantity < newRecord.quantity) {
printf("错误: 商品 %s 库存不足,无法销售。\n", newRecord.name);
return;
}
// 输入进销日期,并检查格式是否正确
printf("请输入进销日期 (YYYY-MM-DD): ");
scanf("%s", newRecord.date);
// 检查日期格式是否正确
if (!isValidDateFormat(newRecord.date)) {
printf("错误: 日期格式不正确,请输入有效的日期格式 'YYYY-MM-DD'。\n");
return;
}
printf("请输入备注: ");
scanf(" %[^\n]", newRecord.note);
// 在添加到记录数组之前,处理库存数组
if (strcmp(newRecord.transaction_type, "进货") == 0) {
if (inventoryIndex == -1) {
// 商品库存数组中不存在该商品,将其添加到库存数组中
strcpy(inventory[inventory_count].name, newRecord.name);
inventory[inventory_count].quantity = newRecord.quantity;
inventory_count++;
}
// 进货操作,增加库存量
inventory[inventoryIndex].quantity += newRecord.quantity;
} else if (strcmp(newRecord.transaction_type, "销售") == 0) {
// 减少库存量
inventory[inventoryIndex].quantity -= newRecord.quantity;
}
// 将新记录添加到数组末尾
records[records_count] = newRecord;
// 记录条数加一
records_count++;
printf("添加成功,是否继续添加进销记录?(是/否): ");
scanf("%s", answer);
if (strcmp(answer, "是") == 0) {
flag = 1; // 用户输入不是“是”,设置标志为0,结束循环
} else {
flag=0;
}
} while(flag);
}
// 打印商品进销记录数组内容
void printSalesRecords() {
int i;
printf("%-10s %-10s %-10s %-10s %-10s %-12s %-20s\n",
"编号", "名称", "类型", "单价", "数量", "日期", "备注");
printf("--------------------------------------------------------------------------------\n");
for (i = 0; i < records_count; ++i) {
printf("%-10d %-10s %-10s %-10.2f %-10d %-12s %-20s\n",
records[i].product_id, records[i].name, records[i].transaction_type,
records[i].unit_price, records[i].quantity, records[i].date, records[i].note);
}
}
// 查询并打印指定编号的进销记录
void findAndPrintRecordById() {
int search_id,i;
int found = 0;
// 接收用户输入的记录编号
printf("请输入要查询的记录编号: ");
scanf("%d", &search_id);
// 查找并打印记录
for (i = 0; i < records_count; ++i) {
if (records[i].product_id == search_id) {
printf("\n找到记录:\n");
printf("%-10s %-10s %-10s %-10s %-10s %-12s %-20s\n",
"编号", "名称", "类型", "单价", "数量", "日期", "备注");
printf("--------------------------------------------------------------------------------\n");
printf("%-10d %-10s %-10s %-10.2f %-10d %-12s %-20s\n",
records[i].product_id, records[i].name, records[i].transaction_type,
records[i].unit_price, records[i].quantity, records[i].date, records[i].note);
found = 1;
break;
}
}
if (!found) {
printf("\n未找到编号为 %d 的记录。\n", search_id);
}
}
// 根据用户输入进行排序并打印
void sortAndPrintRecords() {
struct SalesRecord sortedRecords[MAX_RECORDS];
int sortedCount = 0;
int choice,i,j;
// 打印菜单并接收用户输入
printf("请选择操作编号进行排序:\n");
printf("1. 排序进货数据\n");
printf("2. 排序销售数据\n");
printf("请输入操作编号: ");
scanf("%d", &choice);
// 根据用户选择将对应的记录复制到新数组中
for (i = 0; i < records_count; ++i) {
if ((choice == 1 && strcmp(records[i].transaction_type, "进货") == 0) ||
(choice == 2 && strcmp(records[i].transaction_type, "销售") == 0)) {
sortedRecords[sortedCount++] = records[i];
}
}
// 对新数组按商品数量进行降序排序
for (i = 0; i < sortedCount - 1; ++i) {
for (j = 0; j < sortedCount - 1 - i; ++j) {
if (sortedRecords[j].quantity < sortedRecords[j + 1].quantity) {
struct SalesRecord temp = sortedRecords[j];
sortedRecords[j] = sortedRecords[j + 1];
sortedRecords[j + 1] = temp;
}
}
}
// 打印排序后的记录
printf("\n%-10s %-10s %-10s %-10s %-10s %-12s %-20s\n",
"编号", "名称", "类型", "单价", "数量", "日期", "备注");
printf("--------------------------------------------------------------------------------\n");
for (i = 0; i < sortedCount; ++i) {
printf("%-10d %-10s %-10s %-10.2f %-10d %-12s %-20s\n",
sortedRecords[i].product_id, sortedRecords[i].name, sortedRecords[i].transaction_type,
sortedRecords[i].unit_price, sortedRecords[i].quantity, sortedRecords[i].date, sortedRecords[i].note);
}
}
// 比较日期大小
int compareDate(const char *date1, const char *date2) {
return strcmp(date1, date2);
}
// 计算总和
void sortAndCalculate() {
char start_date[11
没有合适的资源?快使用搜索试试~ 我知道了~
【C语言期末/课程设计】商品进销管理系统(DevC项目)
共6个文件
win:1个
o:1个
c:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 39 浏览量
2024-08-13
17:50:43
上传
评论
收藏 49KB RAR 举报
温馨提示
题目描述: 实现商品的进销库存记录管理。商品信息包括:商品编号,商品名称,商品库存,库存数量,商品单价,进货数量,进货日期,销售数量,销售金额,销售日期等。 功能要求: (1) 输入功能:可以一次完成若干条记录的输入。(注意:如果输入是进货,则库存增加,如果是销售数量,则库存减少,同时计算销售金额) (2) 显示功能:完成全部记录的显示。 (3) 增加功能:在后面添加一条或多条进销记录。 (4) 查找功能:按商品编号编号查找相关进销记录,并显示。 (5) 排序功能:按进货数量或销售数量大小进行排序。 (6) 统计功能:按日期区间统计相关存取款记录总和,并显示。 题目要求: (1) 按照分析、设计、编码、调试、测试的软件过程完成这个应用程序。 (2) 为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。 输入要求: (1) 应用程序运行后在屏幕上显示一个菜单。用户可以根据需求,选定相应的操作项目。进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。程序根据用户输入的信息完成相应的处理, 实现要求的功能。 (2) 能对输入的
资源推荐
资源详情
资源评论
收起资源包目录
devC商品进销管理系统.rar (6个子文件)
devC商品进销管理系统
商品进销管理系统.dev 918B
Makefile.win 998B
main.o 12KB
商品进销管理系统.layout 97B
main.c 11KB
商品进销管理系统.exe 138KB
共 6 条
- 1
资源评论
小辰代写
- 粉丝: 4085
- 资源: 96
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功