现在快到期末,大家肯定在忙着准备期末课设吧 小编在这里也是写了一份C语言的课程设计——商品信息系统
(完整代码放在结尾,大家可自行复制哦)希望对大家有所帮助,有帮助的话,不妨点个关注支持一下 谢谢大家啦!!
商品信息系统
要求商品信息至少包含: 商品编号,商品名称,商品单价,商品库存,商品类型(如饮料,图书,衣服等)等信息。
管理商品信息支持: 添加、删除、修改、查询功能。
要求包含多种模块: (1)输入记录模块:输入商品基本信息存入文件。 (2)查询记录模块:可以根据商品编号,查询商品详细信息。 (3)修改记录模块:可以根据商品编号,进货或者出售。 (4)删除记录模块:可以根据商品编号和商品名称,删除商品信息。 (5)统计模块:可以根据统计某个类型的商品共有多少,可以根据商品编号统一
可通过系统进行商品进货,完善商品种类,保证供应链正常运转。
当商品不再销售时,管理员可删除商品信息,维护数据库整洁。
查询商品信息,包括库存量、价格等,为决策提供数据支持,像查看某商品库存以便及时补货。
管理员可查看目前所有的商品
统计商品同一类型的数据,可知道什么种类的商品有多少,方便管理
可对商品信息进行修改,如调整价格、库存等,确保数据的准确性。
在进行完操作时,可对数据进行保存,以便下次使用
一个系统菜单选择界面,该菜单为循环菜单

管理员可输入商品信息来输入数据

管理员可输入商品名称来删除数据

管理员可输入商品名称来查询数据

管理员可通过展示来查看所有数据

管理员可输入商品名称来修改数据

管理员可输入商品类型来统计该类型的数据

可以对操作的数据进行保存

用于存放用来放顺序表的声明和一些库函数的头文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#include<locale.h>
#include<Windows.h>
#include<mmsystem.h>
#include"Shop.h"
//重定义,方便修改类型
typedef ShInfo SLDataType;
//定义动态顺序表
typedef struct Seqlist
{
SLDataType* arr;
int size;
int capacity;
}SL;
//顺序表的初始化
void SLInit(SL* ps);
//顺序表的销毁
void SLDestroy(SL* ps);
//顺序表开辟空间
void SLCheckCapacity(SL* ps);
//在顺序表尾部插入数据
void SLPushBack(SL* ps, SLDataType x);
//在顺序表头部插入数据
void SLPushFront(SL* ps, SLDataType x);
//在顺序表尾部删除数据
void SLPopBack(SL* ps);
//在顺序表头部删除数据
void SLPopFront(SL* ps);
//在指定位置(pos)之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x);
//在指定位置(pos)删除数据
void SLErase(SL* ps, int pos);用于用来放函数的定义(顺序表的主体)
#include"Seqlist.h"
//顺序表的初始化
void SLInit(SL* ps)
{
assert(ps);
ps->arr = NULL;
ps->capacity = ps->size = 0;
//全部初始化置 0 / NULL
}
//顺序表的销毁
void SLDestroy(SL* ps)
{
assert(ps);
if (ps->arr != NULL)//当其不为空时再释放,避免释放空指针
{
free(ps->arr);
//释放内存
ps->arr = NULL;
//置NULL
}
ps->size = ps->capacity = 0;
//置0
}
//顺序表开辟空间
void SLCheckCapacity(SL* ps)
{
assert(ps);//断言
if (ps->size == ps->capacity)
//当size=capacity时就表示空间不足,此时需要增容,故进入if语句
{
//先设置新变量,增容后再赋值
int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
//设置一个三目操作符判断原空间是否为 0
//当原空间为0时给空间开辟 4 字节;当原空间不为0时给空间增容 2倍
SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));
//由于是在原空间的基础上给空间增容,故我们这里使用 realloc函数 增容
//增容大小为上面的 newcapacity *(类型大小)
if (tmp == NULL)
//加一个 if语句 防止增容失败
{
perror("realloc fail");
exit(1);
}
//没有问题后就赋值
ps->arr = tmp;
ps->capacity = newcapacity;
}
}
//在顺序表尾部插入数据
void SLPushBack(SL* ps, SLDataType x)
{
assert(ps);//断言
SLCheckCapacity(ps);
//用之前写的代码来判断空间是否足够,不够就开辟空间
ps->arr[ps->size++] = x;
//给尾部赋值
}
//在顺序表头部插入数据
void SLPushFront(SL* ps, SLDataType x)
{
assert(ps);//断言空指针
SLCheckCapacity(ps);
//用之前写的代码来判断空间是否足够,不够就开辟空间
for (int i = ps->size; i > 0; i--)
//将所有元素向后挪动一位给头插腾出空间
{
ps->arr[i] = ps->arr[i - 1];
}
ps->arr[0] = x;
//赋值
ps->size++;
//元素个数+1
}
//在顺序表尾部删除数据
void SLPopBack(SL* ps)
{
assert(ps);
//断言空指针
assert(ps->arr != NULL);
//断言顺序表不能为空
ps->size--;
//将元素个数进行 -1 就行
//这样也不会影响到后面的 增、删、查、改
}
//在顺序表头部删除数据
void SLPopFront(SL* ps)
{
assert(ps);
//断言空指针
assert(ps->arr != NULL);
//断言顺序表不能为空
for (int i = 0; i < ps->size - 1; i++)
//所有元素都要向前挪动一位补齐头删留下的空间
{
ps->arr[i] = ps->arr[i + 1];
}
ps->size--;
//将元素个数进行 -1 就行
//这样不会影响到后面的 增、删、查、改
}
//在指定位置(pos)之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{
assert(ps);
//断言空指针
assert(pos >= 0 && pos <= ps->size);
//断言pos是否超出顺序表范围
SLCheckCapacity(ps);
//用之前写的代码来判断空间是否足够,不够就开辟空间
for (int i = ps->size; i > pos; i--)
//将 pos 后面的元素从最后一个元素开始
//向后挪动一位给要插入的元素腾出空间
{
ps->arr[i] = ps->arr[i - 1];
}
ps->arr[pos] = x;
//赋值
ps->size++;
//元素个数+1
}
//在指定位置(pos)删除数据
void SLErase(SL* ps, int pos)
{
assert(ps);
//断言空指针
assert(pos >= 0 && pos <= ps->size);
//断言pos是否超出顺序表范围
for (int i = pos; i < ps->size - 1; i++)
//将 pos 后面的元素从第一个元素开始
//向前挪动一位来补齐删除元素后留下的空间
{
ps->arr[i] = ps->arr[i + 1];
}
ps->size--;
//将元素个数进行 -1 就行
//这样不会影响到后面的 增、删、查、改
}用于存放用来放商品管理函数的声明
#pragma once
#define NUM_MAX 20
#define NAME_MAX 20
#define TYPE_MAX 20
#include<locale.h>
//前置声明
typedef struct Seqlist shop;
//用户数据
typedef struct ShopInfo
{
char num[NUM_MAX];
wchar_t name[NAME_MAX];
float price;
int stock;
wchar_t type[TYPE_MAX];
}ShInfo;
//初始化商品
void InitShop(shop* con);
//添加商品数据
void AddShop(shop* con);
//删除商品数据
void DelShop(shop* con);
//展示商品数据
void ShowShop(shop* con);
//查找商品数据
int FindShop(shop* con, wchar_t name[NAME_MAX]);
//查找打印商品数据
void FindPrintShop(shop* con);
//修改商品数据
void ModifyShop(shop* con);
//销毁商品数据
void DestroyShop(shop* con);
//读取文件数据
void ReadInfo(shop* con);
//保存数据
void PackShop(shop* con);
//清空数据
void CleanShop(shop* con);
//统计数据
void StatsShop(shop* con);
//定位光标
void SetPos(short x, short y);
//退出系统
void ExitShop(shop* con);
//定义颜色函数
void setColor(int color);
void green();
void yellow();
void blue();
void purple();
void cyan();
void white();
void reset();
void red();用于用来放函数的定义(商品管理系统的主体)
#include"Seqlist.h"
#include"Shop.h"
//定义颜色函数
void setColor(int color)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, color);
}
void green() { setColor(10); }
void yellow() { setColor(14); }
void blue() { setColor(9); }
void purple() { setColor(13); }
void cyan() { setColor(11); }
void white() { setColor(15); }
void reset() { setColor(7); }
void red() { setColor(12); }
//定位光标
void SetPos(short x, short y)
{
//获取句柄
HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//设置坐标
COORD pos = { x,y };
//定位光标
SetConsoleCursorPosition(houtput, pos);
}
//交换函数
void Swap(SLDataType* x, SLDataType* y)
{
SLDataType tmp = *x;
*x = *y;
*y = tmp;
}
//排序
void SortShop(shop* con, int cur)
{
while (cur < con->size - 1 && con->arr[cur + 1].price > con->arr[cur].price)
{
Swap(&con->arr[cur + 1], &con->arr[cur]);
cur++;
}
while (cur > 0 && con->arr[cur - 1].price < con->arr[cur].price)
{
Swap(&con->arr[cur - 1], &con->arr[cur]);
cur--;
}
}
//初始化商品数据
void InitShop(shop* con)
{
SLInit(con);
}
//销毁商品数据
void DestroyShop(shop* con)
{
SLDestroy(con);
}
//添加商品数据(尾插)
void AddShop(shop* con)
{
system("cls");
green();
SetPos(39, 4);
printf("添 加 商 品 数 据 界 面");
ShInfo info;
cyan();
SetPos(28, 8);
printf("请分别输入商品的 编号、名称、单价、库存、类型");
reset();
SetPos(35, 12);
wscanf(L"%s %ls %f %d %ls",
&info.num, &info.name, &info.price, &info.stock, &info.type);
SLPushBack(con, info);
yellow();
SetPos(45, 17);
printf("添 加 成 功\n\n");
reset();
SetPos(40, 22);
system("pause");
SortShop(con, con->size - 1);
}
//查找商品数据(通过名字)
int FindShop(shop* con, wchar_t name[NAME_MAX])
{
for (int i = 0; i < con->size; i++)
{
if (strcmp(con->arr[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//删除商品数据
void DelShop(shop* con)
{
char name[NAME_MAX];
system("cls");
green();
SetPos(39, 4);
printf("删 除 商 品 数 据 界 面");
cyan();
SetPos(40, 9);
printf("请输入要删除的商品名:");
reset();
SetPos(47, 12);
wscanf(L"%ls", &name);
int ret = FindShop(con, name);
if (ret >= 0)
{
SLErase(con, ret);
yellow();
SetPos(45, 17);
printf("删除成功\n\n");
}
else
{
yellow();
SetPos(45, 17);
printf("该商品不存在\n\n");
}
reset();
SetPos(40, 22);
system("pause");
}
//查找打印商品数据(通过名字)
void FindPrintShop(shop* con)
{
int g = 0;
char name[NAME_MAX];
system("cls");
green();
SetPos(39, 4);
printf("查 找 商 品 数 据 界 面");
cyan();
SetPos(40, 9);
printf("请输入要查找的商品名:");
reset();
SetPos(47, 12);
wscanf(L"%ls", &name);
for (int i = 0; i < con->size; i++)
{
if (strcmp(con->arr[i].name, name) == 0)
{
g = 1;
yellow();
SetPos(40,16);
printf("找到了,商品信息是");
cyan();
SetPos(30, 18);
printf("\t编号\t名称\t单价\t库存\t类型");
yellow();
SetPos(30, 20);
wprintf(L"\t%s\t%ls\t%.2f\t%d\t%ls",
con->arr[i].num,
con->arr[i].name,
con->arr[i].price,
con->arr[i].stock,
con->arr[i].type);
}
}
if (g == 0)
{
yellow();
SetPos(45, 18);
printf("该商品不存在\n\n");
}
reset();
SetPos(40, 25);
system("pause");
}
//修改商品数据
void ModifyShop(shop* con)
{
char name[NAME_MAX];
system("cls");
green();
SetPos(39, 4);
printf("修 改 商 品 数 据 界 面");
cyan();
SetPos(41, 9);
printf("请输入要修改的商品:");
reset();
SetPos(47, 12);
wscanf(L"%ls", &name);
int ret = FindShop(con, name);
if (ret >= 0)
{
cyan();
SetPos(28, 15);
printf("请分别输入修改后商品的 编号、名称、单价、库存、类型\n");
reset();
SetPos(38, 17);
wscanf(L"%s %ls %f %d %ls",
&con->arr[ret].num,
&con->arr[ret].name,
&con->arr[ret].price,
&con->arr[ret].stock,
&con->arr[ret].type);
yellow();
SetPos(45, 21);
printf("修改成功\n\n");
}
else
{
yellow();
SetPos(45, 16);
printf("该商品不存在\n\n");
}
reset();
SetPos(40, 25);
system("pause");
SortShop(con, ret);
}
//展示商品数据
void ShowShop(shop* con)
{
int i;
system("cls");
green();
SetPos(40, 2);
printf("商 品 数 据 界 面");
SetPos(40, 4);
printf("(按商品单价降序)");
yellow();
SetPos(43, 8);
printf("商 品 的 信 息");
cyan();
SetPos(30, 10);
printf("\t编号\t名称\t单价\t库存\t类型");
yellow();
for (i = 0; i < con->size; i++)
{
SetPos(30, 12 + i);
wprintf(L"\t%s\t%ls\t%.2f\t%d\t%ls",
con->arr[i].num,
con->arr[i].name,
con->arr[i].price,
con->arr[i].stock,
con->arr[i].type);
}
reset();
SetPos(40, 15 + i);
system("pause");
}
//统计数据
void StatsShop(shop* con)
{
int i;
int count = 0;
wchar_t type[TYPE_MAX];
system("cls");
green();
SetPos(39, 3);
printf("统 计 商 品 数 据 界 面");
cyan();
SetPos(39, 5);
printf("请输入要统计的商品类型:");
reset();
SetPos(49, 7);
wscanf(L"%ls", &type);
for (i = 0; i < con->size; i++)
{
if (strcmp(con->arr[i].type, type) == 0)
{
count++;
}
}
if (count > 0)
{
yellow();
SetPos(39, 10);
wprintf(L"类型为%ls的商品有%d个", type, count);
SetPos(38, 11);
printf("如下,按商品单价降序:");
cyan();
SetPos(30, 13);
printf("\t编号\t名称\t单价\t库存\t类型");
yellow();
for (i = 0, count = 0; i < con->size; i++)
{
if (strcmp(con->arr[i].type, type) == 0)
{
SetPos(30, 15 + count);
wprintf(L"\t%s\t%ls\t%.2f\t%d\t%ls",
con->arr[i].num,
con->arr[i].name,
con->arr[i].price,
con->arr[i].stock,
con->arr[i].type);
count++;
}
}
reset();
SetPos(40, 18 + i);
system("pause");
}
else
{
yellow();
SetPos(40, 17);
wprintf(L"没有类型为%ls的商品", type);
reset();
SetPos(40, 22);
system("pause");
}
}
//保存数据
void PackShop(shop* con)
{
system("cls");
FILE* pf = fopen("ShopInfo.txt", "wb");
/*fputs("\t商 品 信 息 系 统\n", pf);
fputs("编号\t名称\t单价\t库存\t类型\n", pf);*/
for (int i = 0; i < con->size; i++)
{
fwrite(&con->arr[i].num, sizeof(con->arr[i].num), 1, pf);
fwrite(&con->arr[i].name, sizeof(con->arr[i].name), 1, pf);
fwrite(&con->arr[i].price, sizeof(con->arr[i].price), 1, pf);
fwrite(&con->arr[i].stock, sizeof(con->arr[i].stock), 1, pf);
fwrite(&con->arr[i].type, sizeof(con->arr[i].type), 1, pf);
}
fclose(pf);
pf = NULL;
yellow();
SetPos(40, 12);
printf("数据保存成功");
reset();
SetPos(37, 18);
system("pause");
}
//清空数据
void CleanShop(shop* con)
{
system("cls");
FILE* pf = fopen("ShopInfo.txt", "wb");
InitShop(con);//初始化
yellow();
SetPos(40, 12);
printf("数据清除成功");
reset();
SetPos(37, 18);
system("pause");
}
//读取文件数据
void ReadInfo(shop* con)
{
int i = 0;
/*char ch[100] = { 0 };*/
FILE* pf = fopen("ShopInfo.txt", "rb");
if (pf == NULL)
{
pf = fopen("ShopInfo.txt", "wb");
}
else
{
SLCheckCapacity(con);
/*fgets(ch, 100, pf);
fgets(ch, 100, pf);*/
while (fread(&con->arr[i].num, sizeof(con->arr[i].num), 1, pf) > 0)
{
fread(&con->arr[i].name, sizeof(con->arr[i].name), 1, pf);
fread(&con->arr[i].price, sizeof(con->arr[i].price), 1, pf);
fread(&con->arr[i].stock, sizeof(con->arr[i].stock), 1, pf);
fread(&con->arr[i].type, sizeof(con->arr[i].type), 1, pf);
con->size++;
i++;
SLCheckCapacity(con);
}
fclose(pf);
pf = NULL;
}
}
//退出系统
void ExitShop(shop* con)
{
system("cls");
yellow();
SetPos(40, 12);
printf("退出商品信息系统");
SetPos(42, 17);
printf("数据保存成功");
reset();
SetPos(37, 22);
system("pause");
}主函数,内含多种自定义函数的调用
#include"Seqlist.h"
#include"Shop.h"
void mune()
{
cyan();
for (int i = 0; i < 10; i++)
{
SetPos(35, i + 8);
printf("*");
SetPos(65, i + 8);
printf("*");
}
SetPos(35, 7);
printf("*******************************");
green();
SetPos(36, 9);
printf(" 商 品 信 息 系 统 ");
yellow();
SetPos(36, 11);
printf(" 1. 添 加 2. 删 除 ");
SetPos(36, 12);
printf(" 3. 查 找 4. 修 改 ");
SetPos(36, 13);
printf(" 5. 展 示 6. 统 计 ");
SetPos(36, 14);
printf(" 7. 保 存 8. 清 空 ");
SetPos(36, 16);
printf(" 0. 退 出 ");
cyan();
SetPos(35, 17);
printf("******************************");
yellow();
SetPos(40, 21);
printf("请输入要执行的操作:");
reset();
}
int main()
{
//本地化
setlocale(LC_ALL, "");
system("title 商 品 信 息 系 统");
system("mode con cols=100 lines=30");
int g;
shop con;//定义
InitShop(&con);//初始化
ReadInfo(&con);
do
{
mune();
scanf("%d", &g);
printf("\n\n");
switch (g)
{
case 1:
AddShop(&con);//添加数据(尾插)
break;
case 2:
DelShop(&con);//删除数据
break;
case 3:
FindPrintShop(&con);//查找打印数据(通过名字)
break;
case 4:
ModifyShop(&con);//修改数据
break;
case 5:
ShowShop(&con);//展示数据
break;
case 6:
StatsShop(&con);//统计数据
break;
case 7:
PackShop(&con);//保存数据
break;
case 8:
CleanShop(&con);//清空数据
break;
case 0:
ExitShop(&con);//退出系统
break;
default:
red();
SetPos(40, 24);
printf("输入错误,请重新输入\n\n");
reset();
SetPos(40, 27);
system("pause");
break;
}
system("cls");
} while (g);
DestroyShop(&con);//销毁数据
return 0;
}OK,本期大一课设——商品信息系统到这里就结束了
本文有若有不足之处,希望各位兄弟们能给出宝贵的意见。谢谢大家!!!
新人,本期制作不易希望各位兄弟们能动动小手,三连走一走!!! 支持一下(三连必回QwQ)
本期资料来自于:
以及: