C语言——超市商品管理系统
基于C语言超市商品管理系统前言在阅读本文之前,首先声明几点:1、本人是一名大一小萌新,也是第一次再平台写文章,目的是想记录下自己当前的学习成果;2、这个系统呢,是自己边看书、边百度进行编写的,并非纯原创,若有博主看到一些与自己内容相似或相同的还请不要见外哈 ^ _ ^;3、该系统的编译环境为Dev C++。一、系统需要实现怎样的功能?1、将录入的数据保存到文件、文件中的信息可以读取出来进行操作;2
基于C语言超市商品管理系统
前言
在阅读本文之前,首先声明几点:
1、本人是一名小萌新,也是第一次再平台写文章,目的是想记录下自己当前的学习成果;
2、这个系统呢,是自己边看书、边百度进行编写的,并非纯原创,若有博主看到一些与自己内容相似或相同的还请不要见外哈 ^ _ ^;
3、该系统的编译环境为Dev C++。
一、系统需要实现怎样的功能?
1、将录入的数据保存到文件、文件中的信息可以读取出来进行操作;
2、对登陆的用户进行选择;
3、对录入的数据进行相关的增、删、改、查操作;
二、重头戏来啦
1.需要的头文件
#include <stdio.h> //声明一些自带的输入输出函数(printf)、类型以及宏
#include <stdlib.h>//系统中进行内存分配和一些数值的转换
#include <string.h>//包含字符串的比较、复制(strcmp、strcpy)
#include <windows.h>//获取Windows当前时间
#include <conio.h>//登陆密码有关的函数
用结构体定义该商品系统所需要的一些基本数据信息
//商品信息
typedef struct shop
{
char type[20]; //种类
char ID[30]; //名称
char number[10]; //位置编号
char saltTime[20]; //销售时间
char locality[20]; //产地
char date[10]; //生产日期
int salt; //销量
char day[20]; //保质期
float price; //价格
int amount; // 库存数量
struct shop *next; //指针域
}SHOP;
//声明的全局变量
SHOP *head = NULL;
SHOP *p1 = NULL; //全局变量 ,头指针head、p1
int count; //全局计数点
2.函数代码实现
//主函数
int main()
{
int shopChoose;//选择登陆方式
int flag = 1;//判断
while (flag == 1)
{
printf("\t\t\t\t\t ╭ % ╮ ╭ ```╮ \n");
printf("\t\t\t\t\t (@^o^@) 超市管理系统 (⌒:⌒)\n");
printf("\t\t\t\t\t (~):(~) (~)v(~) \n");
printf("%70s","\t\t┏┅┅┅┅┅┅┅┅┅┅┅┅┅☆\n");
printf("%66s","[ 1.管理员登陆 ]\n");
printf("%66s","[ 2.客户登陆 ]\n");
printf("%70s","\t\t┗┅┅┅┅┅┅┅┅┅┅┅┅┅┛\n");
printf("请选择:");
scanf("%d",&shopChoose);
switch(shopChoose)
{
case 1://管理员
system("pause");
system("cls");
set(); //选择管理员登陆后的下一级菜单目录
break;
case 2://客户
system("cls");
set1();//客户的下一级菜单目录
break;
default:
printf("输入错误,请重新输入\n");
system("pause");//暂停,防止程序闪退
system("cls"); //清屏函数
break;
}
}
printf("\n");
system("pause");
return 0;
}
//管理员登录的二级目录
void set()
{
int choose; //用户输入的选择
int ture = 1; //循环判断真假
while(ture != 0)
{
printf("\t\t\t\t\t ╭ % ╮ ╭ ```╮ \n");
printf("\t\t\t\t\t (@^o^@) 超市管理系统 (⌒:⌒)\n");
printf("\t\t\t\t\t (~):(~) (~)v(~) \n");
printf("%70s","\t\t┏┅┅┅┅┅┅┅┅┅┅┅┅┅☆\n");
printf("%66s","[ 1.注册账户 ]\n");
printf("%66s","[ 2.登陆账户 ]\n");
printf("%66s","[ 3.找回密码 ]\n");
printf("%70s","\t\t┗┅┅┅┅┅┅┅┅┅┅┅┅┅┛\n");
printf("请选择:");
scanf("%d",&choose);
switch(choose)
{
case 1:
getchar();
system("cls");
registers(); //注册账户
break;
case 2:
progress(); //进度条
system("cls");
Input_login(); //登录账户
getchar();
break;
case 3:
getchar();
reback(); //找回密码
break;
default:
getchar();
rewind(stdin); //清除键盘缓存
printf("输入错误,请重新输入!\n");
system("pause");
system("cls");
break;
}
}
}
这里所用到的登陆注册就是本人经修改之后的(增加了光标定位和睡眠函数(Sleep也就是进度条必须要用到的函数))
再说一下关于密码隐藏的个人理解哈:
在输入密码时,程序会将从键盘获取到的按键信息暂时存至数组中,不显示在电脑屏幕上,显示的就是"*"。
printf("\n\n");
printf("\t\t\t\t │============================================│\n");
printf("\t\t\t\t │ 请输入账号: │\n");
printf("\t\t\t\t │============================================│\n");
cursor(50,3);//光标定位函数(数学的二维坐标系理解)
scanf("%s",&a.id);
while (1)
{
if (strcmp(a.id, b.id)==0) //如果有此用户名
{
break;
}
else
{
if (fp == NULL)
{
printf("还未拥有注册信息,请注册\n");
system("pause");
system("cls");
set();
}
if (!feof(fp)) //如果文件没有读完
{
fread(&b, sizeof(struct The_users), 1, fp);
/*读出数据 b 存放的地址位置,内存大小,每次读取一个数据块 1 ,以读的方式打开文件*/
}
else
{
printf("此用户名不存在,请重新选择!\n");
Sleep(500);
fclose(fp);
getchar();
return;
}
}
}
printf("\n\n\n");
printf("\t\t\t\t │============================================│\n");
printf("\t\t\t\t │ 请输入密码: │\n");
printf("\t\t\t\t │============================================│\n");
cursor(50,8);
while( (a.pwd[i]=getch()) != 13 )//getch()返回值是一个键值,回车的键值是13
{ //将输入的密码存储在数组中在屏幕上输出‘* ’代替数字
i++;
printf("*");//隐藏密码
}
a.pwd[i]='\0';//把最后的回车变成结束符(数组)
printf("\n");
do{
if (strcmp(a.pwd, b.pwd)==0) /*如果密码匹配*/
{
fclose(fp);
Sleep(500);
printf("\n\n\t\t\t\t\t\t登录进行中");
Sleep(500);
printf(".");
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".\n");
Sleep(1000);
fflush(stdin);
printf("\n\n\t\t\t\t\t\t登 录 成 功 !");
Sleep(1000);
system("cls");
welcome(); //动画菜单
return;
//这里应该可以用数据将代码的行数减少,but能力有限(555)
void welcome()
{
//Dev c++ 特有的变色服务
system("color F4");//变色、白底红字
Windowstime();//显示当前Windows时间
printf("\n\n");
printf("\n\n\n\t\t\t\t");
printf("欢");
Sleep(120);
printf(" 迎");
Sleep(120);
printf(" 使");
Sleep(120);
printf(" 用");
Sleep(120);
printf(" X");
Sleep(120);
printf(" X");
Sleep(120);
printf(" X");
Sleep(120);
printf(" 超");
Sleep(120);
printf(" 市");
Sleep(120);
printf(" 商");
Sleep(120);
printf(" 品");
Sleep(120);
printf(" 管");
Sleep(120);
printf(" 理");
Sleep(120);
printf(" 系");
Sleep(120);
printf(" 统!");
Sleep(800);
printf("\n");
system("cls");
menu(); //菜单
}
下面的几部分代码理解之后,直接就是高级程序员的操作(Ctrl +),嘿嘿嘿
//进度条
void progress()
{
int i;
int j;
system("cls");
printf("\n\n\n\n\n\t\t\t\t \033[0;33;40m 正 在 进 入 系 统,请 稍 后 . . . \033[0m");
const char* LastStr = "[--------------------------------------------------] 100%";
// 进度条标志,可以改用"*"或其它符号
const char ProgressIcon = '*';
// 进度每加5,进度条就会加一格,注意Step值要和LastStr中的"-"数量相匹配,两者相乘等于100
const int Step = 2;
// 总共需要多少进度标志,即LastStr中"-"的数量
const int IconMaxNum = 50;
printf("\n\n \t\t\t\t");
for ( i = 0; i <= 100; ++i)
{
// -------------- 打印进度条 --------------
printf("<");
int currentIndex = i / Step;
for ( j = 0; j < IconMaxNum; ++j)
{
if (j < currentIndex)
{
printf("\033[0;33;1m%c", ProgressIcon); // 打印进度条标志
}
else
{
printf(" "); // 未达进度则打印空格
}
}
printf("> ");
// -------- 打印数字进度 ----------
printf("\033[0;35;0m%3d%%", i);
fflush(stdout);
// 每隔100ms打印一次,这里同时每隔100ms会让进度加1
Sleep(3 * 10);
for ( j = 0; j < strlen(LastStr); ++j) //strlen 字符串处理函数
{
printf("\b"); // 回删字符,让数字和进度条原地变化
}
fflush(stdout); //清空输出缓存区
}
printf("\n\n");
return;
}
/*------------------
显示当前Windows时间
-------------------*/
void Windowstime()
{
SYSTEMTIME sys; //所需头文件windows.h,获取windows的时间函数
printf("\t\t\t\t\t 当前时间为:");
GetLocalTime( &sys ); //获取系统时间到程序的函数
printf( "%4d-%02d-%02d %02d:%02d \n",
sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,
sys.wSecond,sys.wDayOfWeek); //按照年/月/日 时/分/秒 星期几格式打印
printf("\n");
return;
}
/*--------
光标定位
--------*/
void cursor(int x, int y)
{
COORD pos; //COORD是Windows API中定义的一种结构
HANDLE h; //HANDLE:句柄
pos.X = x;
pos.Y = y;
h = GetStdHandle(STD_OUTPUT_HANDLE); //获得当前输出窗口的句柄
SetConsoleCursorPosition(h, pos);
}
光标定位
有关光标定位的个人理解(数学的二维直角坐标系):
以电脑屏幕左上角为坐标原点,竖向为X轴,横向为Y轴点位显示(X列,Y行)。
/*---------
管理员菜单
----------*/
void menu()
{
int select=1;
while(select!=0)
{
printf("\n\n\n");
printf("\t\t\t\t\t ╭ ╮ ╭ ```╮ \n");
printf("\t\t\t\t\t (@^o^@) 超市商品管理系统 (⌒:⌒)\n");
printf("\t\t\t\t\t (~):(~) (~)v(~) \n");
printf("\n\n");
printf("\t\t\t\t ╭═════════════════════════════════○●○●═══╮\n");
printf("\t\t\t\t │ 超市商品管理系统 │\n");
printf("\t\t\t\t ╰═══○●○●═════════════════════════════════╯\n");
printf("\t\t\t\t ┌───────────────────────────────────────────-┐\n");
printf("\t\t\t\t │ │\n");
printf("\t\t\t\t │ 1. 录入商品信息 2. 显示商品信息 │\n");
printf("\t\t\t\t │ │\n");
printf("\t\t\t\t │ 3.*保存商品信息 4. 读取商品信息 │\n");
printf("\t\t\t\t │ │\n");
printf("\t\t\t\t │ 5. 统计商品信息 6. 查询商品信息 │\n");
printf("\t\t\t\t │ │\n");
printf("\t\t\t\t │ 7. 修改商品信息 8. 删除商品信息 │\n");
printf("\t\t\t\t │ │\n");
printf("\t\t\t\t │ 9. 商品信息排序 0. 退出管理系统 │\n");
printf("\t\t\t\t │ │\n");
printf("\t\t\t\t └────────────────────────────────────────────┘\n");
Windowstime(); //windows当前时间
printf("\t\t\t\t 请您选择(0-9):");
scanf("%d",&select);
switch(select)
{
case 1://录入信息
inputInformation();
break;
case 2://打印信息
showShop();
break;
case 3://保存信息到文件
//saveInformation();
break;
case 4://读取文件信息
readInformation();
break;
case 5://统计信息
infoShop();
break;
case 6://查询信息
findInformation();
break;
case 7://修改信息
amendInformation();
break;
case 8://删除
delInformation();
break;
case 9://排序
sortInformation();
break;
case 0://退出程序
getchar();
reout();
return;
default:
getchar();
rewind(stdin);//清除键盘缓存
printf("输入错误,请重新输入!\n");
system("pause");
break;
}
}
}
/*-----------
录入商品信息
-----------*/
void inputInformation()
{
SHOP *p2 = NULL;//结构体指针
int choose = 1;
int chooses = 1;//循环判断真假
while (choose == 1)
{
system("cls");
p2 = (SHOP *)malloc(sizeof(SHOP)); //为p2申请内存单元
inputDate(p2);//录入信息界面
if (head == NULL) //判断是否为头结点
{
head = p1 = p2;
p2->next = NULL;
}
else
{
p1->next = p2;//p1指向p2
p2->next = NULL;//p2指向空
p1 = p2;//p2的值赋给p1
}
system("cls");
printf("是否要继续录入商品信息 1.继续 2.退出\n");
scanf("%d", &choose);
if(choose != 1 && choose != 2)
{
printf("选项有误,请重新输入!\n");
printf("是否继续录入:1.继续 2.退出\n");
scanf("%d",&choose);
if(choose == 1)
{
continue;
}
else
{
printf("输入有误,退出录入\n");
system("pause");
break;
}
}
}
system("cls"); //清屏
}
传递参数(实参和形参)
C语言参数传递的三种方式
/*--------
商品信息
参数(p)
---------*/
void inputDate(SHOP *p)
{
printf("\n\n");
printf("\t\t\t\t ╭═════════════════════════════════○●○●═══╮\n");
printf("\t\t\t\t │ 超市商品信息 │\n");
printf("\t\t\t\t ╰═══○●○●═════════════════════════════════╯\n");
printf("\t\t\t\t ┌───────────────────────────────────────────-┐\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 种类: │\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 名称: │\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 编号: │\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 价格: │\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 库存: │\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 销量: │\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 销售时间: │\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 产地: │\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 生产日期: │\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 保质期: │\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t └────────────────────────────────────────────┘\n");
cursor(44,7);
scanf("%s",p->type);//种类
cursor(44,9);
scanf("%s",p->ID);//名称
cursor(44,11);
scanf("%s",p->number);//编号
cursor(44,13);
fflush(stdin);
scanf("%f",&p->price);//价格
getchar();
cursor(44,15);
fflush(stdin);
scanf("%d",&p->amount);//库存
cursor(44,17);
scanf("%d",&p->salt);//销量
cursor(47,19);
scanf("%s",p->saltTime);//销售时间
cursor(44,21);
scanf("%s",p->locality);//产地
cursor(47,23);
scanf("%s",p->date);//生产日期
cursor(45,25);
scanf("%s",p->day);//保质期
count++;//节点个数 +1
}
/*----------
显示商品信息
(管理员)
传递参数 (p) 商品的相关信息
-----------*/
void showShop(SHOP *p)
{
if(head==NULL)
{
printf("目前尚未录入商品信息! 按任意键返回.\n");
getch();
system("pause");
system("cls");
//作用:按任意键程序继续向下执行
return ;
}
printf("商品信息如下:\n");
p = head;
printf("\t编号\t\t名称\t\t种类\t\t 价格\t\t库存\t\t销售日期\t销量\t产地\t生产日期\t保质期\n");
while (p != NULL)
{
printf(" %s %5s %12s %.2f %3d %8s %5d %5s %5s %5s\n",p->number,p->ID,p->type,p->price,p->amount,p->saltTime,p->salt,p->locality,p->date,p->day);
//getchar();
//getch();//按任意键继续打印
p=p->next;
}
printf("\n");
printf("商品信息已全部打印完毕!");
printf("\n");
system("pause");
system("cls");
}
格式化输入输出(顾名思义对格式要求是很严格的,一个不好就直接GG)
这里说一下文件操作可能出现的bug:
1、代码的编写(空格);
2、记事本的编码格式是否与系统默认的编码格式相等(Windows系统默认为GBK(ANSI))
记事本编码格式的更改
/*------------
保存信息到文件
(管理员)
{w}
-------------*/
void saveInformation()
{
/*读取文件信息之后进行操作,将文件数据覆盖保存*/
FILE *fp;//文件指针
SHOP *p;//相关信息指针
p = head;
fp=fopen("e:\\shopping.txt","w");//写入文件信息(覆盖原数据)
if(fp==NULL)//判断文件是否正常打开
{
printf("不能打开文件!");
exit(1);
}
while(p != NULL)//p2不为空时进行数据的录入
{
fprintf(fp,"%10s %10s %10s %lf %d %10s %d %10s %10s %10s\n",p->number,p->ID,p->type,p->price,p->amount,p->saltTime,p->salt,p->locality,p->date,p->day);
p=p->next;
}
printf("文件保存成功!\n");
Sleep(800);
system("pause");
system("cls");
exit(1);
if(fclose(fp))
{
printf("不能关闭文件!");
exit(1);
}
}
void saveInformation2()
{
/*未进行读取文件的操作,进行其他的操作时为防止文件数据丢失在用户退出时进行数据的追加保存*/
FILE *fp;//文件指针
SHOP *p;//相关信息指针
p = head;
fp=fopen("e:\\shopping.txt","a+");//程序结束追加信息
if(fp==NULL)//判断文件是否正常打开
{
printf("不能打开文件!");
exit(1);
}
while(p != NULL)//p2不为空时进行数据的录入
{
fprintf(fp,"%10s %10s %10s %lf %d %10s %d %10s %10s %10s\n",
p->number,p->ID,p->type,p->price,p->amount,p->saltTime,p->salt,p->locality,p->date,p->day);
p=p->next;
}
printf("文件数据追加成功!\n");
Sleep(800);
system("pause");
system("cls");
exit(1);
if(fclose(fp))
{
printf("不能关闭文件!");
exit(1);
}
}
/*----------
读取文件信息
-----------*/
void readInformation()
{
/*
这里注释掉的代码可以不用理他
//读取(非链表)
FILE * fp;
char ch;
if((fp=fopen("e:\\shopping.txt","r+"))==NULL)
{
printf("Cannot open the file!\n");
return ;
}
ch=fgetc(fp);
while(ch!=EOF)
{
printf("%c",ch);
ch=fgetc(fp);
}
fclose(fp);
printf("\n读取成功...\n");
system("pause");
return ;
}
*/
FILE *fp; /*文件指针*/
SHOP *p; /*结构体指针*/
int i=0; //节点个数
head=(SHOP *)malloc(sizeof(SHOP)); //申请内存单元
head->next=NULL;
fp=fopen("e:\\shopping.txt","r");
if(fp == NULL)
{
printf("打开文件失败!");
exit(1);
}
if(fp!=NULL)
{
p1 = head;
while(!feof(fp))//feof(始终在某个文件末尾)系统看光标位置后边是否有数据来选择是否继续读取
{
p = (SHOP *)malloc(sizeof(SHOP));
p->next = NULL;
fscanf(fp,"%10s %10s %10s %f %d %10s %d %10s %10s %10s\n",p->number,p->ID,p->type,&p->price,&p->amount,p->saltTime,&p->salt,p->locality,p->date,p->day);
printf("%10s %10s %10s %f %d %10s %d %10s %10s %10s\n",p->number,p->ID,p->type,p->price,p->amount,p->saltTime,p->salt,p->locality,p->date,p->day);
p1->next = p;
p1 = p;
i++; //赋值循环给节点 (自增)
if(i==1)
{
head=p1;
}
}
}
if(fclose(fp))
{
printf("关闭文件失败");
exit(1);
}
//return head;
printf("文件读取成功. . .");
printf("\n\n\n");
system("pause");
system("cls");
return;
}
/*----------
统计商品信息
----------*/
void infoShop()
{
SHOP *p; //结构体指针
int temp = 0;//做判断
p = head;/*头结点赋值给 p */
printf("\t统计进行中,请稍后");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".\n");
Sleep(1000);
fflush(stdin);
printf("\t结果如下:\n");
while (p != NULL)
{
/*库存小于10的商品信息*/
if(p->amount < 50)
{
printf("\n");
printf("销量:%d 编号:%s 名称:%7s 种类:%7s 价格:%.2f 库存:%d 销售日期:%7s 产地:%7s 生产日期:%7s 保质期:%s \n",
p->salt,p->number,p->ID,p->type,p->price,p->amount,p->saltTime,p->locality,p->date,p->day);
printf("\n\t该进货了,亲^_^\n");
temp = 1;
}
p = p->next;
}
if (temp == 0)
{
printf("没有库存小于50的商品. . .\n");
}
printf("\n");
system("pause");
system("cls");
}
/*-------
查询信息
(管理)
-------*/
void findInformation()
{
SHOP *p2; //结构体
int opt_c; //用户输入选项
int ture = 1;
int flag = 0; //判断真假
char s_ID[10]; //用户输入要查询的商品名称
char s_number[10]; //用户输入要查询的商品编号
p2=head;//p2赋值为头结点
while(ture == 1)
{
printf("\n");
printf("\t┌-^-^-^-^-^-^-^-^-┐\n");;
printf("\t |1、按照编号查询 |\n");
printf("\t |2、按照名称查询 |\n");
printf("\t |3、退出查询 |\n");
printf("\t└ V-V-V-V-V-V-V-V-┘\n");
printf("请选择:\n");
fflush(stdin);//清空键盘缓存
scanf("%s",&opt_c);
switch (opt_c)
{
case '1'://编号查询
system("pause");
system("cls"); //暂停和清屏
p2=head;
printf("\n\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 请输入编号: │\n");
printf("\t\t\t\t │========================================== │\n");
cursor(50,3);
scanf("%s",&s_number);
flag = 0;
while(p2 != NULL)
{
//flag = 1;
if(strcmp(s_number,p2->number) == 0)
{
flag = 1;
printf("\n\n");
printf("\t\t\t\t ╭═════════════════════════════════○●○●═══╮\n");
printf("\t\t\t\t │ 查询商品信息 │\n");
printf("\t\t\t\t ╰═══○●○●═════════════════════════════════╯\n");
printf("\t\t\t\t ┌───────────────────────────────────────────-┐\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 种类:%s │\n",p2->type);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 名称:%s │\n",p2->ID);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 价格:%.2f \t│\n",p2->price);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 库存:%d │\n",p2->amount);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 销量:%d │\n",p2->salt);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 销售时间:%s │\n",p2->saltTime);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 产地:%s │\n",p2->locality);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 生产日期: %s │\n",p2->date);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 保质期:%s \t│\n",p2->day);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t └────────────────────────────────────────────┘\n");
}
p2=p2->next;
}
if(flag == 0)
{
printf("查无此商品. . .");
printf("\n");
break;
}
system("pause");
system("cls");
break;
case '2'://名称查询
system("pause");
system("cls");
p2=head;
printf("\n\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 请输入名称: │\n");
printf("\t\t\t\t │========================================== │\n");
cursor(50,3);
scanf("%s",&s_ID);
flag = 0;
while(p2 != NULL)
{
//flag = 1;
if(strcmp(s_ID,p2->ID) == 0 )
{
flag = 1;
printf("\n\n");
printf("\t\t\t\t ╭═════════════════════════════════○●○●═══╮\n");
printf("\t\t\t\t │ 查询商品信息 │\n");
printf("\t\t\t\t ╰═══○●○●═════════════════════════════════╯\n");
printf("\t\t\t\t ┌───────────────────────────────────────────-┐\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 编号:%s │\n",p2->number);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 种类:%s │\n",p2->type);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 价格:%.2f \t│\n",p2->price);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 库存:%d │\n",p2->amount);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 销量:%d │\n",p2->salt);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 销售时间:%s │\n",p2->saltTime);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 产地:%s │\n",p2->locality);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 生产日期: %s │\n",p2->date);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 保质期:%s │\n",p2->day);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t └────────────────────────────────────────────┘\n");
}
p2=p2->next;
}
if(flag == 0)
{
printf("查无此商品. . .");
printf("\n");
system("pause");
system("cls");
break;
}
system("pause");
system("cls");
break;
case '3'://退出
printf("感谢使用!\n");
return;
default:
getchar();
printf("输入错误,请重新输入:\n");
system("pause");
break;
}
}
}
/*-------
修改信息
-------*/
void amendInformation()
{
SHOP *p2; //初始化结构体指针p2
int opt_c; //用户输入选项
//int choose;
int flag; //判断真假
char s_ID[10]; //按照名称
char s_number[10]; //按照编号
int content; //用户输入选项
int content1; //用户输入选项
p2=head;
printf("\n");
printf("\t┌-^-^-^-^-^-^-^-^-┐\n");;
printf("\t |1、编号查询修改 |\n");
printf("\t |2、名称查询修改 |\n");
printf("\t |3、退出修改 |\n");
printf("\t└ V-V-V-V-V-V-V-V-┘\n");
//rewind(stdin);
printf("请选择:\n");
scanf("%d",&opt_c);
while(opt_c != 3)
{
if(opt_c == 1)//编号查询
{
system("pause");
system("cls");
p2=head;
printf("\n\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 请输入商品编号: │\n");
printf("\t\t\t\t │========================================== │\n");
cursor(54,3);
scanf("%s",&s_number);
flag = 0;
while(p2 != NULL)
{
if(strcmp(s_number,p2->number) == 0)
{
flag = 1;
printf("\n\n");
//p2 = head;
printf("\t\t\t\t ╭═════════════════════════════════○●○●═══╮\n");
printf("\t\t\t\t │ 修改商品信息 │\n");
printf("\t\t\t\t ╰═══○●○●═════════════════════════════════╯\n");
printf("\t\t\t\t ┌───────────────────────────────────────────-┐\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 1.种类:%s │\n",p2->type);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 2.名称:%s │\n",p2->ID);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 3.价格:%.2f │\n",p2->price);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 4.库存:%d │\n",p2->amount);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 5.销量:%d │\n",p2->salt);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 6.销售日期:%s │\n",p2->saltTime);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 7.产地:%s │\n",p2->locality);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 8.生产日期:%s │\n",p2->date);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 9.保质期:%s │\n",p2->day);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t └────────────────────────────────────────────┘\n");
fflush(stdin);
printf("请输入要修改的内容选项:\n");
scanf("%d",&content);
switch (content)
{
case 1:
printf("请输入商品种类:\n");
scanf("%s",p2->type);
break;
case 2:
printf("请输入商品名称:\n");
scanf("%s",p2->ID);
break;
case 3:
printf("请输入商品价格:\n");
scanf("%f",&p2->price);
break;
case 4:
printf("请输入商品库存:\n");
scanf("%d",&p2->amount);
break;
case 5:
printf("请输入商品销量:\n");
scanf("%d",&p2->salt);
break;
case 6:
printf("请输入商品销售日期:\n");
scanf("%s",p2->saltTime);
break;
case 7:
printf("请输入商品产地:\n");
scanf("%s",p2->locality);
break;
case 8:
printf("请输入商品生产日期:\n");
scanf("%s",p2->date);
break;
case 9:
printf("请输入商品保质期:\n");
scanf("%s",p2->day);
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}
p2 = p2->next;
}
if(flag == 0)
{
printf("无该商品相关信息. . .");
printf("\n");
break;
}
printf("修改进行中");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".\n");
Sleep(1000);
fflush(stdin);
printf("修改成功!\n");
Sleep(500);
printf("请返回打印查看. . . \n");
return menu();
}
else if(opt_c == 2 )//名称查询修改
{
system("pause");
system("cls");
p2=head;
printf("\n\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 请输入名称: │\n");
printf("\t\t\t\t │========================================== │\n");
cursor(50,3);
scanf("%s",&s_ID);
flag = 0;
while(p2 != NULL)
{
if(strcmp(s_ID,p2->ID) == 0)
{
flag = 1;
printf("\n\n");
p2 = head;
printf("\t\t\t\t ╭═════════════════════════════════○●○●═══╮\n");
printf("\t\t\t\t │ 修改商品信息 │\n");
printf("\t\t\t\t ╰═══○●○●═════════════════════════════════╯\n");
printf("\t\t\t\t ┌───────────────────────────────────────────-┐\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 1.编号:%s │\n",p2->number);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 2.种类:%s │\n",p2->type);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 3.价格:%.2f \t│\n",p2->price);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 4.库存:%d │\n",p2->amount);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 5.销量:%d │\n",p2->salt);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 6.销售时间:%s │\n",p2->saltTime);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 7.产地:%s │\n",p2->locality);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 8.生产日期:%s │\n",p2->date);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 9.保质期:%s │\n",p2->day);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t └────────────────────────────────────────────┘\n");
fflush(stdin);
printf("请输入要修改的内容选项:\n");
scanf("%d",&content1);
switch (content1)
{
case 1:
printf("请输入商品编号:\n");
scanf("%s",p1->number);
break;
case 2:
printf("请输入商品种类:\n");
scanf("%s",p1->type);
break;
case 3:
printf("请输入商品价格:\n");
scanf("%f",&p2->price);
break;
case 4:
printf("请输入商品库存:\n");
scanf("%d",&p1->amount);
break;
case 5:
printf("请输入商品销量:\n");
scanf("%d",&p1->salt);
break;
case 6:
printf("请输入商品销售日期:\n");
scanf("%s",p1->saltTime);
break;
case 7:
printf("请输入商品产地:\n");
scanf("%s",p1->locality);
break;
case 8:
printf("请输入商品生产日期:\n");
scanf("%s",p1->date);
break;
case 9:
printf("请输入商品保质期:\n");
scanf("%s",p1->day);
break;
default:
printf("输入错误,请重新输入:\n");
system("pause");
break;
}
}
p2 = p2->next;
}
if(flag == 0)
{
printf("无该商品相关信息. . .");
printf("\n");
break;
}
printf("修改进行中");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".\n");
Sleep(1000);
fflush(stdin);
printf("修改成功!\n");
printf("请返回打印查看. . . \n");
return menu();
}
else if(opt_c == 3 )
{
printf("退出修改!\n");
return;
}
else
{
printf("输入错误、已退出!\n");
system("pause");
return;
}
}
}
/*--------
删除信息
--------*/
void delInformation()
{
SHOP *p2;//判断的当前节点
SHOP *pb;//要删除的节点数据
SHOP *pf;//要删除的节点的前趋节点
p2 = head;
pf = head;
pb = head;
int ture;
int flag;//判断真假
int option;//用户输入的选项
int s_option;//判断选项
char S_id[20];//临时存放名称
char s_num[10];//临时存放编号
printf("\n");
printf("\t┌-^-^-^-^-^-^-^-^-┐\n");;
printf("\t |1、查询编号删除 |\n");
printf("\t |2、查询名称删除 |\n");
printf("\t |3、退出删除 |\n");
printf("\t└ V-V-V-V-V-V-V-V-┘\n");
rewind(stdin);
printf("请选择:");
scanf("%s",&option);
switch(option)
{
case '1'://编号删除
system("pause");
system("cls");
p2=head;
printf("\n\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 请输入商品编号: │\n");
printf("\t\t\t\t │========================================== │\n");
cursor(54,3);
scanf("%s",&s_num);
while(pb != NULL )
{
if(strcmp(s_num,pb->number) == 0)
{
flag = 1;
printf("\n\n");
printf("\t\t\t\t ╭═════════════════════════════════○●○●═══╮\n");
printf("\t\t\t\t │ 商品信息 │\n");
printf("\t\t\t\t ╰═══○●○●═════════════════════════════════╯\n");
printf("\t\t\t\t ┌───────────────────────────────────────────-┐\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 1.种类:%s │\n",pb->type);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 2.名称:%s │\n",pb->ID);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 3.价格:%.2f │\n",pb->price);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 4.库存:%d │\n",pb->amount);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 5.销量:%d │\n",pb->salt);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 6.销售日期:%s │\n",pb->saltTime);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 7.产地:%s │\n",pb->locality);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 8.生产日期:%s │\n",pb->date);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 9.保质期:%s │\n",pb->day);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t └────────────────────────────────────────────┘\n");
printf("是否选择删除?\n");
printf("1--yse 0--no\n");
printf("请选择:");
scanf("%d",&s_option);
if(s_option == 1)
{
if(pb == head)//判断pb是否指向头结点
{
head=head->next;
}
else
{
pf->next=pb->next;//让pf的下一个节点等于pb的下一个节点
}
printf("删除进行中");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".\n");
Sleep(1000);
fflush(stdin);
printf("数据删除成功!");
saveInformation1();//更新文件信息
}
else if(s_option == 0)
{
printf("取消删除!");
}
}
pf=pb;
pb=pb->next;
}
if(flag == 0)
{
printf("无该商品相关信息. . .");
printf("\n");
}
break;
case '2':
system("pause");
system("cls");
p2=head;
printf("\n\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 请输入商品名称: │\n");
printf("\t\t\t\t │========================================== │\n");
cursor(54,3);
scanf("%s",&S_id);
while(pb != NULL )
{
if(strcmp(S_id,pb->ID) == 0)
{
flag = 1;
printf("\n\n");
//p2 = head;
printf("\t\t\t\t ╭═════════════════════════════════○●○●═══╮\n");
printf("\t\t\t\t │ 商品信息 │\n");
printf("\t\t\t\t ╰═══○●○●═════════════════════════════════╯\n");
printf("\t\t\t\t ┌───────────────────────────────────────────-┐\n");
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 1.编号:%s │\n",pb->number);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 2.种类:%s │\n",pb->type);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 3.价格:%.2f │\n",pb->price);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 4.库存:%d │\n",pb->amount);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 5.销量:%d │\n",pb->salt);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 6.销售日期:%s │\n",pb->saltTime);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 7.产地:%s │\n",pb->locality);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 8.生产日期:%s │\n",pb->date);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t │ 9.保质期:%s │\n",pb->day);
printf("\t\t\t\t │========================================== │\n");
printf("\t\t\t\t └────────────────────────────────────────────┘\n");
printf("是否选择删除?\n");
printf("1--yse 0--no\n");
printf("请选择:");
scanf("%d",&s_option);
if(s_option == 1)
{
if(pb == head)//判断pb是否指向头结点
{
head=head->next;
}
else
{
pf->next=pb->next;//让pf的下一个节点等于pb的下一个节点
}
printf("删除进行中");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".");
Sleep(500);
printf(".\n");
Sleep(1000);
fflush(stdin);
printf("数据删除成功!");
saveInformation1();//更新文件信息
}
else if(s_option == 0)
{
printf("取消删除!");
}
else
{
printf("输入错误,请重新输入\n");
continue;
}
}
pf=pb;
pb=pb->next;
}
if(flag == 0)
{
printf("无该商品相关信息. . .");
printf("\n");
}
break;
case '3': //退出删除
printf("感谢使用!\n");
break;
default:
printf("输入错误,已退出!\n");
system("pause");
break;
}
}
/*-------
排序
-------*/
void sortInformation()
{
char choise; //用户选项
SHOP *pb;
SHOP *pf;
SHOP temp; //临时存放数据地址
SHOP *p2; //定义临时节点指针变量
p2 = head;
while (choise != '3')
{
printf("\n");
printf("\t┌-^-^-^-^-^-^-^-^-┐\n");;
printf("\t |1、依据库存排序 |\n");
printf("\t |2、依据价格排序 |\n");
printf("\t |3、退出 |\n");
printf("\t└ V-V-V-V-V-V-V-V-┘\n");
printf("请选择:");
scanf("%s",&choise);
//库存数量进行排序
if (choise == '1')
{
p2=head;
if(p2 == NULL)
{
//链表为空
printf("无相关数据. . .\n");
return ;
}
if(p2->next == NULL)
{
//链表有1个节点
printf("数据仅存在一条\n");
return ;
}
while(p2->next != NULL) //p2的下一个节点不为空
{
pb = p2->next; //将该节点数据赋值给pb
while(pb != NULL) //pb不为空
{
//从小到大排序
//冒泡排序
if(p2->amount > pb->amount)//pb与p2进行比较
{
//交换数据
temp = *p2; //取amount的值进行交换 放在临时空间
*p2 = *pb; //pb的数据给p2
*pb = temp; //临时存放的数据给pb
//将临时申请的节点与原有的链表节点进行连接
temp.next = p2->next;
p2->next = pb->next;
pb->next = temp.next;
}
pb = pb->next;//pb指向尾
}
p2 = p2->next;//p2指向尾
}
printf("排序成功!请返回打印查看. . .\n");
}
//价格进行排序
else if(choise == '2')
{
p2=head;
if(p2 == NULL)
{
//链表为空
printf("无相关数据\n");
return ;
}
if(p2->next == NULL)
{
//链表有1个节点
printf("数据仅存在一条\n");
return ;
}
while(p2->next != NULL)//以p2指向的节点为基准节点
{
pb = p2->next;//pb从基准点的下一个节点开始
while(pb != NULL)
{
//从小到大排序
//冒泡排序
if(p2->price > pb->price)
{
temp = *p2;
*p2 = *pb;
*pb = temp;
temp.next = p2->next;
p2->next = pb->next;
pb->next = temp.next;
}
pb = pb->next;
}
p2 = p2->next;
}
printf("排序成功!请返回打印查看. . .\n");
}
//退出
else if(choise == '3')
{
break;
//return 1;
}
else
{
printf("输入错误请重新输入!\n");
system("pause");
}
}
}
/*-------
退出系统
-------*/
void reout()
{
char reoutback; //定义选项选择变量
int flag = 1; //判断
while(flag)
{
printf("\n\n\n");
printf("\t\t\t 退出时系统会在保存的文件末尾进行文件数据的追加,如若读取了文件数据,请选择覆盖原数据退出");
printf("\n\n\n\n");
printf("确定要退出?(1.追加数据文件并退出(未读取数据) 2.覆盖原数据并退出(已读取数据))\n");
scanf("%d",&reoutback);
if(reoutback == 1)
{
printf("感谢使用!\n"); //退出系统
Sleep(1000);
saveInformation2(); //追加信息到文件
exit(0);
}
else if(reoutback == 2)
{
saveInformation();//覆盖原有数据进行保存
}
else if(reoutback != 2)
{
printf("\n菜单选项有误,请重新输入\n");
}
}
}
这个系统呢,是我一学期下来的成果,不是很完善,但我自己认为还是可以的,如果各位认为不是很好的话,还请手下留情(孩子最害怕暴力了,孩子需要鼓励,555)
3.个人的一些感悟
1、作为一个写代码的,最重要的就是代码结构要清晰!要清晰!清晰!(重要的事情说三遍!)这样以便于以后的修改和维护,强迫症看起来也会很舒服滴。
2、函数名要见名知意,不能是那种ABC拼音啥的,那种的可读性不是很强,椰蓉哟引起烦躁的情绪,试想一下,你去一家公司接上一个辞职的员工未做完的项目,看到函数名是ABC,会怎样?(反正我是当场去世。 。 。 )
3、最后要注意的就是代码内容的注释,就拿当前这个来举例,鄙人上边的那个代码注释还是对萌新比较友好的哈,我当时搜到的内容看的是一脸懵逼,如果你的那个代码写的是非专业人士都能看懂的那种的话,那就是很牛逼惹,至少我是这么认为的(普通人都能懂,更别说那些个专业人士了)。
总结
软件这一行发展是飞速的,你永远不知道你现在所使用的语言工具是否会在明天就被淘汰,所以,你只能不停地去奔跑,不停地去学习新东西,but学习也是要劳逸结合滴。
最后的最后,送给萌新学生但又不局限于学生一句话:
学如逆水行舟,不进则退;心似平原走马,易放难收;贵有恒,何必三更起五更眠;最无益,只怕是一日曝十日寒。
^ _ ^
可以的话我们一起进步学习嘛. . . ^ _ ^(嘿嘿嘿)
这个是源码链接哈,需要的自己提取哈
ANSI编码(百度网盘乱码)
链接:https://pan.baidu.com/s/1b2uL4QrNKw9HcNqtQl2_bA
提取码:krk3
关于网盘乱码的问题可以选择UTF-8编码
UTF-8编码(百度网盘无乱码)
链接:https://pan.baidu.com/s/1FCRJq4Ae2RoTzXRCelIF2A?pwd=d6v3
提取码:d6v3
更多推荐
所有评论(0)