1.功能设计
该应用的整体是通过链表进行实现的。
产品销售管理系统所提供的功能主要包括:
(1)实现用户注册账号、登录账号、查询商品、购买商品、查询当前余额等操作。
(2)实现管理人员利用商品销售管理系统,进行货物上架、货物下架、查询当前利润、修改商品信息等操作。
(3)实现退出主界面页面
总体模块的划分:
二、应用的界面设计:
产品销售管理系统含有用户的登录、注册账号程序、管理人员的登录、注册账号、查看产品、修改产品信息等管理程序;它的大致结构如下:该系统通过输出程序、购买程序、来实现商店销售信息管理程序的显示商品信息功能、购买等功能,通过使用两个不同的输出函数,使得不同的身份,所看的商品信息而不同。各个功能之间的调用通过option函数中的switch语句来实现。同时实现各个界面之间的转换,其中使用的while(1)死循环。目的是不使程序自己退出,而是由人为的操作进行退出或者进行各个功能之间的自由转换。通过文件的应用对各个账户的信息都进行保存使得用户信息的保留。以便下一次的直接使用。(避免用户每次都要注册账号的事情发生)(以该程序的第一界面的选项进行演示)
void optionOne(struct product* p,struct id* ID){
int num;//选项值
int k=1;
int num2;
while(1){
selectionOne();
printf("请选择您需要的业务\n");
scanf("%d",&num);
switch(num){
case 1:
system("cls");
num2=loginSystem(p,ID);
optionTow(p,ID,num2);
break;
case 2:
system("cls");
num2=registeraccount(ID);
optionTow(p,ID,num2);
break;
case 3:
system("cls");
loginSystem(p,ID);
optionThree(p,ID);
break;
case 4:
system("cls");
printf("请稍等后按任意键退出系统\n");
destroy(p);
p=NULL;//将生成的p指针回空
destroy(ID);
ID=NULL;//将生成的ID指针回空
exit(0);//退出程序
break;
default:
system("cls");
printf("请选择已有的业务\n");
break;
}
}
}
三、用户账号的注册和登录:
3.1产品销售管理系统的登录、注册程序的结构设计
本程序用来查看用户登录的账号是否正确,对新用户的账号注册,并对账号信息进行写入文档等相关的处理,使用流程图显示相关功能。流程图结构如下:
登陆函数的实现(应用到了文件的读写操作):
int loginSystem(struct product* p,struct id* ID){
int idnum;
int k=0;
int Password;
struct id i;
FILE *fd;//文件指针
fd=fopen("C:\\Users\\86183\\Desktop\\账户信息.txt","r");//以只读的形式打开文件
printf("请输入你的信息\n");
printf("ID:");
scanf("%d",&idnum);
printf("密码:");
scanf("%d",&Password);
while(fscanf(fd,"%d\t%d\t%f\n",&i.id.ID,&i.id.Password,&i.id.balance)!=EOF){//利用循环将文件中的账号信息读出与手动输入的账号进行对比
if(idnum==i.id.ID){
if(Password==i.id.Password){
return idnum;//找到了返回该账号,以在下个界面显示
}
else{
k++;
}
}
}
if(k!=0){
printf("密码错误,请重新登录\n");
}else{
printf("抱歉没找到您的账户信息,请前往注册\n");
}
optionOne(p,ID);
}
注册函数的实现:
实现逻辑:
//利用文件的写入操作将信息写入到账户信息文件中进行保存
//结合腾讯QQ账号申请的案例,利用随机数生成一个随机的6位的账号
//至于余额可一更进一步,按照充值的思想将余额写入。但作为一个遗憾暂未实现(这一部分希望大家可以根据自己的想法自行实现)
int registeraccount(struct id* D){
struct id* ID=D;
int num;
int password;
FILE *fd;
fd=fopen("C:\\Users\\86183\\Desktop\\账户信息.txt","a");
srand((unsigned)time(NULL));
ID->id.ID=100000+rand()%900000;//生成[100000~999999]的随机ID
ID->id.balance=100000+rand()%900000;//生成[100000~999999]的随机余额
num=ID->id.ID;
printf("请输入您的密码:");
scanf("%d",&password);
ID->id.Password=password;
insertdatabyid(ID,ID->id);
fprintf(fd,"%d\t%d\t%f\n",ID->id.ID,ID->id.Password,ID->id.balance);//利用fprintf函数将信息写入文件
fclose(fd);
return num;
}
总体功能还请使用一下(使用前请调好文件的路径问题,避免程序的崩溃)
ps:文件路径调试请修改这种代码,(使用时可以直接在桌面上新建一个.txt文件,将.txt文件的路径分别改掉就ok了)。
fd=fopen("C:\\Users\\86183\\Desktop\\账户信息.txt","r");
程序源代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/*
该程序涉及到了文件,如使用请注意文件路径问题
程序总体储存结构为链式储存
*/
void optionOne(struct product* p,struct id* ID);//函数声明
void optionTow(struct product* p,struct id* ID,int id);//函数声明
void optionThree(struct product* p,struct id* ID);//函数声明
//创建product的数据域
struct data{
char name[20];//产品名
int serialNumber;//编号
float sellingPrice;//产品售价
float purchasePrice;//产品进价
int remainingQuantity;//产品剩余数量
};
float profit=0;//定义一个全局变量,用来保存当前的利润
//创建id的数据域
struct product{
struct data product;//数据域
struct product *next; //结构体指针
};
struct iddata{
int ID;//账号
int Password;//密码
float balance;//余额
};
struct id{
struct iddata id;//数据域
struct id *next;//结构体指针
};
//结构体product链式结构的初始化
struct product* initproduct(){
struct product* p=(struct product*)malloc(sizeof(struct product));
p->next=NULL;
return p;
}
//结构体id链式结构的初始化
struct id* initid(){
struct id* id=(struct id*)malloc(sizeof(struct id));
id->next=NULL;
return id;
}
//结构体product生成新的节点
struct product* creatnode(struct product* p){
struct product* newnode=(struct product*)malloc(sizeof(struct product));
newnode->next=p->next;
p->next=newnode;
return newnode;
}
//生成新的节点
struct id* creatnewnode(struct id* i){
struct id* newnode=(struct id*)malloc(sizeof(struct id));
newnode->next=i->next;
i->next=newnode;
return newnode;
}
//写入商品信息到链表中
void insertdatabyproduct(struct product* p,struct data product){
struct product* newnode=creatnode(p);
newnode->product=product;
}
//写入新的账号到链表中
void insertdatabyid(struct id* i,struct iddata id){
struct id* newnode=creatnewnode(i);
newnode->id=id;
}
//从客户的角度显示输出商品信息
void printproductdata(struct product* p){
struct product* l=p->next;
if(l==NULL){
printf("暂无商品\n");
}
while(l){
printf("商品名称:%s\t",l->product.name);
printf("商品编号:%d\t",l->product.serialNumber);
printf("商品售价:%.2f\t",l->product.sellingPrice);
printf("商品剩余数量:%d\t",l->product.remainingQuantity);
printf("\n");
l=l->next;
}
}
//以文件的形式读写商品
//void printproductdata(struct product* p){
// struct product* l=p->next;
// struct product k;
// FILE *fd;
// fd=fopen("C:\\Users\\86183\\Desktop\\产品信息.txt","r");
// if(fd==NULL){
// printf("文件打开失败\n");
// }else{
// while(fscanf(fd,"%s\t%d\t%f\t%f\t%d\n",k.product.name,&k.product.serialNumber,&k.product.purchasePrice,&k.product.sellingPrice,&k.product.remainingQuantity)!=EOF){
// printf("商品名称:%s\t",k.product.name);
// printf("商品编号:%d\t",k.product.serialNumber);
// printf("商品售价:%.2f\t",k.product.sellingPrice);
// printf("商品剩余数量:%d\t",k.product.remainingQuantity);
// printf("\n");
// }
// }
//
// fclose(fd);
//}
//从管理人员的角度显示输出商品信息
void printproductdataTow(struct product* p){
struct product* l=p->next;
if(l==NULL){
printf("暂无商品\n");
}
while(l){
printf("商品名称:%s\t",l->product.name);
printf("商品编号:%d\t",l->product.serialNumber);
printf("商品进价:%.2f\t",l->product.purchasePrice);
printf("商品售价:%.2f\t",l->product.sellingPrice);
printf("商品剩余数量:%d\t",l->product.remainingQuantity);
printf("\n");
l=l->next;
}
}
//以文件的形式读写商品
//void printproductdataTow(struct product* p){
// struct product* l=p->next;
// struct product k;
// FILE *fd;
// fd=fopen("C:\\Users\\86183\\Desktop\\产品信息.txt","r");
// if(fd==NULL){
// printf("文件打开失败\n");
// }else{
// while(fscanf(fd,"%s\t%d\t%f\t%f\t%d\n",k.product.name,&k.product.serialNumber,&k.product.purchasePrice,&k.product.sellingPrice,&k.product.remainingQuantity)!=EOF){
// printf("商品名称:%s\t",k.product.name);
// printf("商品编号:%d\t",k.product.serialNumber);
// printf("商品进价:%.2f\t",k.product.purchasePrice);
// printf("商品售价:%.2f\t",k.product.sellingPrice);
// printf("商品剩余数量:%d\t",k.product.remainingQuantity);
// printf("\n");
// }
// }
//
// fclose(fd);
//}
//销毁product链表
void destroy(struct product* p){
struct product* l1=p->next;
struct product* l2=p;
while(l2){
free(l2);
l2=l1;
l1=p->next;
}
}
//销毁id链表
void destroy(struct id* id){
struct id* l1=id->next;
struct id* l2=id;
while(l2){
free(l2);
l2=l1;
l1=id->next;
}
}
//当前时间的显示
void currentTime(){
time_t timer;
struct tm *Now;
time( &timer );
Now = localtime( &timer );
printf("\t\t\t\t\t您的登陆时间和日期:%s", asctime(Now));
}
//登录系统的函数
//调用到了存放账户信息的文件的读操作
int loginSystem(struct product* p,struct id* ID){
int idnum;
int k=0;
int Password;
struct id i;
FILE *fd;//文件指针
fd=fopen("C:\\Users\\86183\\Desktop\\账户信息.txt","r");//以只读的形式打开文件
printf("请输入你的信息\n");
printf("ID:");
scanf("%d",&idnum);
printf("密码:");
scanf("%d",&Password);
while(fscanf(fd,"%d\t%d\t%f\n",&i.id.ID,&i.id.Password,&i.id.balance)!=EOF){//利用循环将文件中的账号信息读出与手动输入的账号进行对比
if(idnum==i.id.ID){
if(Password==i.id.Password){
return idnum;//找到了返回该账号,以在下个界面显示
}
else{
k++;
}
}
}
if(k!=0){
printf("密码错误,请重新登录\n");
}else{
printf("抱歉没找到您的账户信息,请前往注册\n");
}
optionOne(p,ID);
}
//注册账号
//利用文件的写入操作将信息写入到账户信息文件中进行保存
//结合腾讯QQ账号申请的案例,利用随机数生成一个随机的6位的账号
//至于余额可一更进一步,按照充值的思想将余额写入。但作为一个遗憾暂未实现
int registeraccount(struct id* D){
struct id* ID=D;
int num;
int password;
FILE *fd;
fd=fopen("C:\\Users\\86183\\Desktop\\账户信息.txt","a");
srand((unsigned)time(NULL));
ID->id.ID=100000+rand()%900000;//生成[100000~999999]的随机ID
ID->id.balance=100000+rand()%900000;//生成[100000~999999]的随机余额
num=ID->id.ID;
printf("请输入您的密码:");
scanf("%d",&password);
ID->id.Password=password;
insertdatabyid(ID,ID->id);
fprintf(fd,"%d\t%d\t%f\n",ID->id.ID,ID->id.Password,ID->id.balance);//利用fprintf函数将信息写入文件
fclose(fd);
return num;
}
//检查函数,目的是再用户购买后将用户余额值、商品剩余量、当前利润进行修改。
void check(struct product* p,struct id* i,int num1,int num2,int idnum){
struct product* l=p->next;
struct id* b=i->next;
struct id o;
FILE *fd;
fd=fopen("C:\\Users\\86183\\Desktop\\账户信息.txt","r");
while(l){
if(num1==l->product.serialNumber){
while(fscanf(fd,"%d\t%d\t%f\n",&o.id.ID,&o.id.Password,&o.id.balance)!=EOF){
fclose(fd);
if(idnum==o.id.ID){
o.id.balance=o.id.balance-num2*l->product.sellingPrice;
l->product.remainingQuantity=l->product.remainingQuantity-num2;
profit=profit+(float)num2*(l->product.sellingPrice-l->product.purchasePrice);
fd=fopen("C:\\Users\\86183\\Desktop\\账户信息.txt","w");
fprintf(fd,"%d\t%d\t%f\n",o.id.ID,o.id.Password,o.id.balance);
fclose(fd);
}
}
}
l=l->next;
}
}
//补货的判断条件 && 补充新商品
//本打算利用文件将商品信息进行修改,但未实现
void replenishmentOne(struct product* p){
int k=1;
char a;
while(k){
// fd=fopen("C:\\Users\\86183\\Desktop\\产品信息.txt","a");
printf("请输入产品名称:");
scanf("%s",p->product.name);
printf("请输入编号:");
scanf("%d",&p->product.serialNumber);
printf("请输入售价:");
scanf("%f",&p->product.sellingPrice);
printf("请输入剩余量:");
scanf("%d",&p->product.remainingQuantity);
printf("请输入进价:");
scanf("%f",&p->product.purchasePrice);
// fprintf(fd,"%s\t%d\t%f\t%f\t%d\n",p->product.name,p->product.serialNumber,p->product.purchasePrice,p->product.sellingPrice,p->product.remainingQuantity);
// fclose(fd);
insertdatabyproduct(p,p->product);
setbuf(stdin,NULL);//清空键盘的缓冲区
printf("是否继续输入(Y/N)\n");
scanf("%c",&a);
if(a=='N'||a=='n'){
k=0;
}
}
k=1;
}
//补货的判断条件 && 修改售价
void replenishmentTow(struct product* p,int num){
struct product* l=p->next;
while(l){
if(num==l->product.serialNumber){
setbuf(stdin,NULL);//清空键盘的缓冲区
printf("请输入您要将商品售价修改到多少:");
scanf("%f",&l->product.sellingPrice);
printf("商品售价修改成功\n");
}
l=l->next;
}
}
//补货的判断条件 && 修改进价
void replenishmentThree(struct product* p,int num){
struct product* l=p->next;
while(l){
if(num==l->product.serialNumber){
setbuf(stdin,NULL);//清空键盘的缓冲区
printf("请输入您要将商品进价修改到多少:");
scanf("%f",&l->product.purchasePrice);
printf("商品进价修改成功\n");
}
l=l->next;
}
}
//补货的判断条件 && 修改数量
void replenishmentFour(struct product* p,int num){
struct product* l=p->next;
while(l){
if(num==l->product.serialNumber){
setbuf(stdin,NULL);//清空键盘的缓冲区
printf("请输入您要将商品剩余数量修改到多少:");
scanf("%d",&l->product.remainingQuantity);
printf("商品剩余数量修改成功\n");
}
l=l->next;
}
}
//创建删除函数
//判断该节点的数据是否与要删除的数据相等
//如果相等则删除该节点,否则继续循环
//free释放空间
void deletelist(struct product* p,int b){
struct product* list=p->next;
struct product* listfront=p;
while(list){
if(list->product.serialNumber==b){
listfront->next=list->next;
free(list);
printf("该商品数据已被删除\n");
break;
}
else{
listfront=list;
list=list->next;
}
}
if(list==NULL){
printf("当前还没有任何商品\n");
}
}
//界面一
void selectionOne(){
printf("\n\n\n\n");
printf("\t\t\t\t******************************************************\n");
printf("\t\t\t\t* 产品管理系统 *\n");
printf("\t\t\t\t* 1.登录系统 *\n");
printf("\t\t\t\t* 2.用户注册 *\n");
printf("\t\t\t\t* 3.管理人员登录 *\n");
printf("\t\t\t\t* 4.退出系统 *\n");
printf("\t\t\t\t******************************************************\n");
currentTime();
}
//界面二
void selectionTow(int ID){
printf("\n\n\n\n");
printf("\t\t\t\t 用户ID:%d已登录 \n",ID);
printf("\t\t\t\t******************************************************\n");
printf("\t\t\t\t* 欢迎登录产品管系统 *\n");
printf("\t\t\t\t******************************************************\n");
printf("\t\t\t\t* 1.显示当前所有产品 *\n");
printf("\t\t\t\t* 2.购买产品 *\n");
printf("\t\t\t\t* 3.个人中心 *\n");
printf("\t\t\t\t* 4.返回上一级 *\n");
printf("\t\t\t\t******************************************************\n");
currentTime();
}
//界面三
void selectionThree(){
printf("\n\n\n\n");
printf("\t\t\t\t* 欢迎管理人员登录 *\n");
printf("\t\t\t\t******************************************************\n");
printf("\t\t\t\t* 1.查看商品剩余量 *\n");
printf("\t\t\t\t* 2.商品信息修改 *\n");
printf("\t\t\t\t* 3.查看当前利润 *\n");
printf("\t\t\t\t* 4.返回上一级 *\n");
printf("\t\t\t\t******************************************************\n");
currentTime();
}
//界面四
void selectionFour(int ID){
printf("\n\n\n\n");
printf("\t\t\t\t 用户ID的个人中心:%d已登录\n",ID);
printf("\t\t\t\t******************************************************\n");
printf("\t\t\t\t* 1.查看余额 *\n");
printf("\t\t\t\t* 2.返回上一级 *\n");
printf("\t\t\t\t******************************************************\n");
currentTime();
}
//界面五
void selectionFive(){
printf("\t\t\t\t******************************************************\n");
printf("\t\t\t\t* 1.补充新商品 *\n");
printf("\t\t\t\t* 2.修改售价 *\n");
printf("\t\t\t\t* 3.修改进价 *\n");
printf("\t\t\t\t* 4.修改数量 *\n");
printf("\t\t\t\t* 5.商品下架 *\n");
printf("\t\t\t\t* 6.返回上一级 *\n");
printf("\t\t\t\t******************************************************\n");
currentTime();
}
//选项五
void optintFive(struct product* p,struct id* ID){
int num;//选项值
while(1){
selectionFive();
printf("请输入您的选项\n");
scanf("%d",&num);
switch(num){
case 1:
system("cls");
replenishmentOne(p);
break;
case 2:
system("cls");
printf("请输入要修改的商品编号\n");
scanf("%d",&num);
replenishmentTow(p,num);
break;
case 3:
system("cls");
printf("请输入要修改的商品编号\n");
scanf("%d",&num);
replenishmentThree(p,num);
break;
case 4:
system("cls");
printf("请输入要修改的商品编号\n");
scanf("%d",&num);
replenishmentFour(p,num);
break;
case 5:
system("cls");
printf("请输入要修改的商品编号\n");
scanf("%d",&num);
deletelist(p,num);
break;
case 6:
system("cls");
optionThree(p,ID);
break;
default:
printf("请选择已有选项\n");
}
}
}
//选项三
void optionThree(struct product* p,struct id* ID){
int num;//选项值
int k=1;
char a;
while(1){
selectionThree();
printf("请选择您的业务\n");
scanf("%d",&num);
switch(num){
case 1:
system("cls");
printproductdataTow(p);
break;
case 2:
system("cls");
optintFive(p,ID);
break;
case 3:
system("cls");
printf("当前利润为%.2f\n",profit);
break;
case 4:
system("cls");
optionOne(p,ID);
break;
default:
system("cls");
printf("请选择已有业务\n");
break;
}
}
}
//选项四
void optionFour(struct product* p,struct id* ID,int id){
struct id i;
int idnum=id;
int num;//选项值
FILE *fd;
while(1){
selectionFour(id);
printf("请选择您的业务\n");
scanf("%d",&num);
switch(num){
case 1:
system("cls");
fd=fopen("C:\\Users\\86183\\Desktop\\账户信息.txt","r");
while(fscanf(fd,"%d\t%d\t%f\n",&i.id.ID,&i.id.Password,&i.id.balance)!=EOF){
if(idnum==i.id.ID){
printf("您的余额是%f\n",i.id.balance);
}
}
fclose(fd);
break;
case 2:
system("cls");
optionTow(p,ID,id);
break;
default:
system("cls");
printf("请选择已有选项\n");
break;
}
}
}
//选择二
void optionTow(struct product* p,struct id* ID,int id){
int num;//选项值
int num1,num2;
while(1){
selectionTow(id);
printf("请选择您的业务\n");
scanf("%d",&num);
switch(num){
case 1:
system("cls");
printproductdata(p);
break;
case 2:
system("cls");
printf("请选择要购买的商品的编号\n");
scanf("%d",&num1);
printf("请输入购买数量\n");
scanf("%d",&num2);
check(p,ID,num1,num2,id);
printf("购买成功\n");
break;
case 3:
system("cls");
optionFour(p,ID,id);
break;
case 4:
system("cls");
optionOne(p,ID);
break;
}
}
}
//选择一
void optionOne(struct product* p,struct id* ID){
int num;//选项值
int k=1;
int num2;
while(1){
selectionOne();
printf("请选择您需要的业务\n");
scanf("%d",&num);
switch(num){
case 1:
system("cls");
num2=loginSystem(p,ID);
optionTow(p,ID,num2);
break;
case 2:
system("cls");
num2=registeraccount(ID);
optionTow(p,ID,num2);
break;
case 3:
system("cls");
loginSystem(p,ID);
optionThree(p,ID);
break;
case 4:
system("cls");
printf("请稍等后按任意键退出系统\n");
destroy(p);
destroy(ID);
exit(0);//退出程序
break;
default:
system("cls");
printf("请选择已有的业务\n");
break;
}
}
}
//主函数
int main(){
struct product* p=initproduct();
struct id* ID=initid();
optionOne(p,ID);
return 0;
}