首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C语言】大一期末课程设计——商品信息系统!!!(包含文件、汉化、颜色等等)

【C语言】大一期末课程设计——商品信息系统!!!(包含文件、汉化、颜色等等)

作者头像
zore
发布2025-12-30 19:00:25
发布2025-12-30 19:00:25
930
举报
文章被收录于专栏:C/C++ 专栏C/C++ 专栏

前言

现在快到期末,大家肯定在忙着准备期末课设吧 小编在这里也是写了一份C语言的课程设计——商品信息系统 (完整代码放在结尾,大家可自行复制哦) 希望对大家有所帮助,有帮助的话,不妨点个关注支持一下 谢谢大家啦!!

一、题目说明

商品信息系统

1.商品信息

要求商品信息至少包含: 商品编号,商品名称,商品单价,商品库存,商品类型(如饮料,图书,衣服等)等信息。

2.管理商品

管理商品信息支持: 添加、删除、修改、查询功能。

2.包含模块

要求包含多种模块: (1)输入记录模块:输入商品基本信息存入文件。 (2)查询记录模块:可以根据商品编号,查询商品详细信息。 (3)修改记录模块:可以根据商品编号,进货或者出售。 (4)删除记录模块:可以根据商品编号和商品名称,删除商品信息。 (5)统计模块:可以根据统计某个类型的商品共有多少,可以根据商品编号统一

二、程序功能说明

  • 1. 进货功能

可通过系统进行商品进货,完善商品种类,保证供应链正常运转。

  • 2. 删除功能

当商品不再销售时,管理员可删除商品信息,维护数据库整洁。

  • 3. 信息查询功能

查询商品信息,包括库存量、价格等,为决策提供数据支持,像查看某商品库存以便及时补货。

  • 4. 展示功能

管理员可查看目前所有的商品

  • 5. 统计功能

统计商品同一类型的数据,可知道什么种类的商品有多少,方便管理

  • 6. 修改功能

可对商品信息进行修改,如调整价格、库存等,确保数据的准确性。

  • 7. 保存功能

在进行完操作时,可对数据进行保存,以便下次使用

三、成品展示

1.系统主菜单

一个系统菜单选择界面,该菜单为循环菜单

在这里插入图片描述
在这里插入图片描述

2.进货

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

在这里插入图片描述
在这里插入图片描述

3.删除

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

在这里插入图片描述
在这里插入图片描述

4.查询

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

在这里插入图片描述
在这里插入图片描述

5.展示

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

在这里插入图片描述
在这里插入图片描述

6.修改

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

在这里插入图片描述
在这里插入图片描述

7.统计

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

在这里插入图片描述
在这里插入图片描述

8.保存

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

在这里插入图片描述
在这里插入图片描述

四、完整代码演示

1. Seqlist.h

用于存放用来放顺序表的声明和一些库函数的头文件

代码语言:javascript
复制
#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);

2. Seqlist.c

用于用来放函数的定义(顺序表的主体)

代码语言:javascript
复制
#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 就行
	//这样不会影响到后面的 增、删、查、改
}

3. Shop.h

用于存放用来放商品管理函数的声明

代码语言:javascript
复制
#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();

4. Shop.c

用于用来放函数的定义(商品管理系统的主体)

代码语言:javascript
复制
#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");
}

5. Test.c

主函数,内含多种自定义函数的调用

代码语言:javascript
复制
#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)

本期资料来自于:

https://legacy.cplusplus.com/

以及:

https://learn.microsoft.com/zh-cn/windows/win32/api/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、题目说明
    • 1.商品信息
    • 2.管理商品
    • 2.包含模块
  • 二、程序功能说明
  • 三、成品展示
    • 1.系统主菜单
    • 2.进货
    • 3.删除
    • 4.查询
    • 5.展示
    • 6.修改
    • 7.统计
    • 8.保存
  • 四、完整代码演示
    • 1. Seqlist.h
    • 2. Seqlist.c
    • 3. Shop.h
    • 4. Shop.c
    • 5. Test.c
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档