1.功能设计

该应用的整体是通过链表进行实现的。

产品销售管理系统所提供的功能主要包括:

(1)实现用户注册账号、登录账号、查询商品、购买商品、查询当前余额等操作。

(2)实现管理人员利用商品销售管理系统,进行货物上架、货物下架、查询当前利润、修改商品信息等操作。

(3)实现退出主界面页面

总体模块的划分:

java营销系统技术架构设计 营销系统结构_java营销系统技术架构设计

 

 

二、应用的界面设计:

产品销售管理系统含有用户的登录、注册账号程序、管理人员的登录、注册账号、查看产品、修改产品信息等管理程序;它的大致结构如下:该系统通过输出程序、购买程序、来实现商店销售信息管理程序的显示商品信息功能、购买等功能,通过使用两个不同的输出函数,使得不同的身份,所看的商品信息而不同。各个功能之间的调用通过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产品销售管理系统的登录、注册程序的结构设计

本程序用来查看用户登录的账号是否正确,对新用户的账号注册,并对账号信息进行写入文档等相关的处理,使用流程图显示相关功能。流程图结构如下:

 

 

java营销系统技术架构设计 营销系统结构_链表_02

 

java营销系统技术架构设计 营销系统结构_java营销系统技术架构设计_03

 

 

登陆函数的实现(应用到了文件的读写操作): 

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;
}