大一的C语言课设,先把代码放在这里,后面有空再写讲解。
项目目录结构如下:
“爱心百货商场商品信息管理系统.c”就是主体,先自己在文件夹里创建“登陆次数.txt”和“商品信息预导入数据.txt”,然后将内容复制过去,再运行 “爱心百货商场商品信息管理系统.c”。
爱心百货商场商品信息管理系统.c
// 欢迎使用爱心百货商场商品信息管理系统!!!!! 无敌!!!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <unistd.h>
// 定义商场结构体,包括商品数据属性
typedef struct {
char name[1000]; // 商品名称
char id[1000]; // 商品ID编号 // 如果定义“int id”,给商品编号05222068的时候会自动舍弃掉前面的0,输出5222068
char type[1000]; // 商品类型
char production_date[1000]; // 生产日期
char expiration_date[1000]; // 保质期
char price[1000]; // 商品价格
char inventory[1000]; // 商品库存数量
// 这里本来是定义价格和数量是int和double型的,但是导入数据的时候老是报错Process exited after 7.745 seconds with return value 3221225477,不清楚哪里有跨界访问内存,就干脆都改成字符串型了,后面需要使用整型时就直接用atoi函数转换就行了。
// 不仅是导入商品数据时有问题,录入信息时如果在应该输入int型数据的价格处输入字符串,比如说"请输入商品价格(例:12):"这里输入了“你好”,add()函数就会直接跳过库存数量的输入,直接完成商品信息的输入创建一个商品,此问题在增删改查这几个函数中都会发生
} Shop;
struct user{ // 定义一个结构体数组存储账号密码,本管理系统可支持100个账户的创建
char id[100];
char password[100];
} user[100];
Shop products[100000]; // 定义一个长度为100000的全局变量数组来存储商品信息 ,无论在哪个函数中,只要能访问到这两个全局变量,都可以对其进行操作,包括修改、读取等
int classProducts = 0; // 商品种类列表初始化为0,也可以看作单一商品类别数
int classProducts_temp[100]; //定义一个临时int型数组存储classProducts的值,如果不这样操作,直接用classProducts_in()里面的fscanf导入classProducts的值会报错错误内存访问
int num_login_temp[100]; // 和上面同理,这里记录登陆次数
int num_all_Products = 0; // 商品总数初始化为0
int num_login = 0; // 登陆系统的次数初始化为0,确切来说是登陆系统且退出系统时进行了信息修改的导出操作的次数,定义这个是为了用于纯信息数据导入功能
int num_enroll = 0; // 登陆界面的注册次数
int acc_load = 0;
// 声明系统各功能函数,不在这里声明会报错[Error] 'xx函数' was not declared in this scope
void add(); // 添加商品信息
void show(); // 展示商品信息
void over_delete(); // 删除商品 // 因为c语言存在delete()函数,所以用over_delete()定义删除商品信息的函数
void change(); // 修改商品
void search(); //搜索商品
void sort(); // 商品信息排序
void count(); // 商品信息统计
void load(); // 登陆界面函数
void login(); // 登录函数
void enroll(); // 注册函数
void welcome(); // 欢迎界面,这里是个爱心
void time_load(); // 这是个加载时间伪装函数
void list_out(); // 商品信息导出报表,这是美观的报表格式商品信息
void save_in(); // 商品信息导入,这是已经预设好的商品数据
void save_out(); // 商品信息导出,这是纯商品数据,方便用来导入信息
void save_in_auto(); // 商品信息自动导入
void classProducts_out(); // 导出classProducts
void classProducts_in(); // 导入classProducts
void menu(); // 主菜单函数
int main()
{
FILE *login_num;
login_num = fopen("登陆次数.txt", "r"); // 可读
fscanf(login_num, "%d\n", num_login_temp);
num_login = num_login_temp[0];
fclose(login_num);
// printf("%d", num_login);
load(); // 登陆界面
time_load();
system("cls");
welcome(); // 欢迎界面
sleep(2);
system("cls");
if(num_login > 0)
{
save_in_auto();
}
system("cls");
// 第一次启动系统时不进行自动导入信息,第二次开始会根据第一次退出系统时是否进行导出信息(代码128行),自动存入上次系统中导出的商品信息
while(1)
{
menu() ;
char choice = getch(); // 如果使用单纯while或者do while循环,因为定义的是int choice,所以输入的choice为中文或字母系统容易崩溃,所以使用getch()函数直接输入键盘字符
system("cls"); // 如果这里不清屏的话,就会连带功能函数和主界面函数一起输出,不美观
// scanf("%d", &choice);
// 根据用户选择调用相应的函数
switch(choice)
{
case '1': // 这里如果直接是case 1的话,choice接收的值都会被判断为异常,所以要加单引号
add();
system("cls");
break;
case '2':
show();
break;
case '3':
search();
break;
case '4':
change();
break;
case '5':
over_delete();
break;
case '6':
count();
break;
case '7':
sort();
break;
case '8':
save_in();
system("pause");
system("cls");
break;
case '9':
list_out();
system("cls");
break;
case '0':
if (classProducts != 0)
{
printf("|======================================|\n");
printf("| 是否保存保存本次商品信息修改(y/n) |\n");
printf("|======================================|\n");
char n = getch();
if (n == 'y')
{
login_num = fopen("登陆次数.txt", "r"); // 可读
fscanf(login_num, "%d\n", num_login_temp);
num_login = num_login_temp[0];
fclose(login_num);
num_login++;
login_num = fopen("登陆次数.txt", "w");
fprintf(login_num, "%d\n", num_login);
fclose(login_num);
classProducts_out();
save_out();
num_login++;
printf("\n|==========================================|\n");
printf("| 感谢使用爱心百货商场商品管理系统 |\n");
printf("|==========================================|\n");
exit(0);
}
else if (n == 'n')
{
printf("\n|==========================================|\n");
printf("| 感谢使用爱心百货商场商品管理系统 |\n");
printf("|==========================================|\n");
exit(0);
}
}
else
{
printf("\n|==========================================|\n");
printf("| 感谢使用爱心百货商场商品管理系统 |\n");
printf("|==========================================|\n");
exit(0);
}
default:
printf("\n====================================\n");
printf(" 无效的选择,请重新输入\n");
printf("====================================\n\n");
system("pause");
system("cls");
}
printf("\n");
}
return 0;
}
void menu()
{
system("title 爱心百货商场商品信息管理系统"); //设置cmd窗口名
system("color F5"); // 第一个数字7指定背景颜色为white,第二个数字指定前景(文字)颜色为purple
printf("+------------------------------------------------------------------------+\n");
printf(" 亲爱的用户,欢迎使用爱心百货商场商品管理系统!\n");
printf(" ");system("date /T");
printf(" ");system("time /T");
printf("+------------------------------------------------------------------------+\n\n");
printf("==========================================================================\n");
// printf("*********************************************************************\n");
printf("==++++++++++++++++++++++++++++管理系统主菜单++++++++++++++++++++++++++++==\n");
printf("|| [1]录入商品信息 ||\n");
printf("|| [2]显示所有商品信息 ||\n");
printf("|| [3]查找商品信息 ||\n");
printf("|| [4]修改商品信息 ||\n");
printf("|| [5]删除商品信息 ||\n");
printf("|| [6]统计商品信息 ||\n");
printf("|| [7]商品信息排序 ||\n");
printf("|| [8]商品信息导入 ||\n");
printf("|| [9]商品信息导出 ||\n");
printf("|| [0]退出系统 ||\n");
printf("==++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++==*\n");
// printf("*********************************************************************\n");
printf("==========================================================================\n");
printf("请输入您的选择(0~9):\n");
}
// 录入商品信息
void add()
{
printf("\n=========== 录入商品信息 ===========\n");
printf("请输入商品名称:");
scanf("%s", products[classProducts].name);
printf("请输入商品ID号(例:0001):");
scanf("%s", products[classProducts].id);
printf("请输入商品类型(例:食品类):");
scanf("%s", products[classProducts].type);
printf("请输入商品生产日期(例:2023.06.28):");
scanf("%s", products[classProducts].production_date);
printf("请输入商品保质期(例:24个月):");
scanf("%s", products[classProducts].expiration_date);
printf("请输入商品价格(例:12):");
scanf("%s", products[classProducts].price);
printf("请输入商品库存数量(例:100):");
scanf("%s", products[classProducts].inventory);
// for (int i = 0; i < classProducts; i++) // 傻瓜行为
// {
printf("商品库存数量:%d \n", products[i].inventory); // 用来验证局部变量products[i].inventory是否录入了此商品的库存数量
// num_all_Products = num_all_Products + products[i].inventory; // 录入每一种商品都要将其商品数量计入商品总数,便于统计
// }
num_all_Products = num_all_Products + atoi(products[classProducts].inventory); // 录入每一种商品都要将其商品数量计入商品总数,便于统计
classProducts++; // 之前把"classProducts++"放在"num_all_Products = num_all_Products + products[classProducts].inventory"前面了,导致下标索引对不上,这里的商品总数老是输出0,还特意写了个循环来录入商品总数,写完才发现只是简单的下标索引问题,哈哈
// printf("现在商品种类数为:%d\n", classProducts);
// printf("现在所有商品的数量为:%d", num_all_Products);
// classProducts++;
// num_all_Products += products[classProducts].inventory; // 录入每一种商品都要将其商品数量计入商品总数,便于统计
// printf("现在商品种类数为:%d\n", classProducts);
// printf("%d\n", products[classProducts].inventory);
// printf("现在所有商品的数量为:%d", num_all_Products);
printf("商品信息录入成功!\n");
printf("====================================\n");
system("pause");
}
// 显示所有商品信息
void show()
{
int i;
if (classProducts == 0)
{
printf("====================================\n");
printf(" 商场内暂无商品。\n");
printf("======&#