一、 选题背景及意义
购物中,数据维护量大,人工管理费时费力,效率低下,而且当查找某条记录时,由于数据量庞大,人工查找相当麻烦,效率低。当前社会飞速发展,原始记录方式已经被社会淘汰,计算机化管理正是适应时代的产物。计算机在各行各业中的运用已经得到普及。自动化,信息化的管理越来越广泛应用于各个领域。介于此,开发一套基于京东平台的购物管理系统。
二、 系统主要功能
主要有五个功能:
1.用户管理
用户在进行购物之前,需要先进行登录,这样用户结束购物时,通过登录账号来进行结账。对于新用户,可以在登录页面进行用户注册,通过填写注册信息,将信息提交给服务器。如果用户名已经存在,系统将向用户显示相应的错误信息,并提示用户使用其它的用户名进行注册。用户登录后可以随时修改个人注册信息。在用户输入用户名和密码后,系统将确认用户名和密码是否正确,如果验证成功,使用户处于登录状态。否则,系统只是显示用户名和密码的错误信息。
2.商品管理
可以录入商品信息、对已经录入的商品进行排序,购买商品或者退货,对商品的信息进行添加或者删除,对商品信息查找和浏览
3.购物车管理
用户在浏览商品的过程中,可以将所有满意的商品放入购物车中,可以移除购物车中不想购买的商品。可以修改购买商品的数量。
4.退出系统
退出京东购物系统,结束本程序
5.保存文件
将已经注册的用户信息、已经录入的商品信息以及用户所选的购物车商品的信息,存储到TEXT文件当中
三、 各功能模块设计实现思路
分模块编写程序将程序分为:
1、 头文件区域
2、 函数声明区域
3、 结构体和全局变量定义区域
4、 主函数区域
5、 功能函数区域
1.在用户管理函数中才用结构体数组定义用户信息,并定义全局变量记录用户注册数目,注册时对姓名密码进行判断
2.采用双链表存储商品信息,因为对商品的排序交换,增删改查都是双向链表的有点
3.采用双向链表存储购物车的商品信息
四、 运行结果
初始界面
进入用户管理
注册:成功后显示登录账号
登录:登录成功后显示用户相关信息3
修改密码:先进行密码确认,正确后输入想修改的密码,自动返回
退出:返回一界面
进入商品管理:
初始界面
录入商品:可以循环录入,输入相关商品信息完成录入
商品排序:若为录入商品则无法进行排序
按照三种类别进行排序:编号、名称、类别
编号排序
名称排序:
类别排序:
商品购退:
商品进货:
商品退货:
商品的信息添加与删除:
商品的信息删除:
商品信息修改:
商品信息浏览:
购物车管理
如果未登陆则无法进入:
管理界面:
商品添加:可以选择退出
商品删除:
查看已选商品:
查看已选商品:
退出系统:
保存文件:
在对应文件夹中可以看到相关文件
商品信息:
用户信息:
购物车信息
本程序能够记住用户信息,第二运行时能记住上一次的用户注册:
用户数位1
进行用户登录,登录成功:
code:
有需要可以自己用,不要白嫖啦,顺手点个赞,关注当然更好了
/*head files area*/
#include <stdio.h> //输入输出头文件
#include "iostream" //清除当前屏幕内容
#include <ctype.h> //user_name_judgment
#include <stdlib.h> //字符处理函数
#include <string.h>
#include "windows.h"
/* *************************函数声明*************************** */
/*用户管理模块函数声明*/
int user_name_judgment(char *p); //用户姓名判断
int user_password_judgment(char *p); //用户密码判定
void manager_user(); //用户管理函数
int manager_user_1(); //用户管理——1.注册
void manager_user_2(); //用户管理——2.登录
void manager_user_3(); //用户管理——3.修改密码
void manager_user_4(); //用户管理——4.退出
/*商品管理模块函数声明*/
int manager_goods_1(); //录入商品
void manager_goods_2(); //商品排序
void manager_goods_3_face(); //商品购退初始界面
void manager_goods_3(); //商品购退
void manager_goods_4(); //商品信息添加删除
void manager_goods_5(); //商品信息修改
void manager_goods_6(); //商品信息查找和浏览
void manager_goods_face(); //商品管理函数界面
void manager_goods(); //商品管理函数
/*购物车管理模块函数声明*/
int manager_shoppingcart_1(); //商品添加
void manager_shoppingcart_2(); //商品删除
void manager_shoppingcart_2(); //商品删除
void manager_shoppingcart_face(); //购物车函数管理初始界面
void manager_shoppingcart(); //购物车管理
/*退出系统模块函数声明*/
void exit_system();
/*保存文件模块函数声明*/
void save_file();
/*初始界面和功能函数选择声明*/
void interfaces();
void choice();
/*附加功能*/
int readmassage(); //将之前的信息读取到结构体数组,商品链表,购物车链表中
/* ******************结构体定义********************************/
typedef struct //用户结构体定义
{
char name[20];
char password[13];
char interest[26];
char work[20];
} user_massage;
user_massage user[50]; //定义用户数
typedef struct goods_massage{ //商品函数结构体定义
int NO;
int name;
int sort;
int amount;
double price;
goods_massage *next, *head; //双链表头尾指针,使商品节点在交换时,方便交换
}goods, *p_goods;
typedef struct shoppingcart //购物车函数定义
{
int NO;
int name;
int sort;
int amount;
double price;
shoppingcart *next, *head;
}cart ,*p_shoppingcart;
//全局变量定义
p_goods L = (goods *)malloc(sizeof(goods)); //生成商品的一个头节点
p_shoppingcart Lsc = (shoppingcart *)malloc(sizeof(shoppingcart)); //生成购物车的一个头节点
int count=0; //已经注册用户人数
int load =0; //登录状态确认
/* ***********************主函数*********************************************************/
int main()
{
L->next = NULL; //将商品头结点的next赋为空
Lsc->next = NULL; //购物车链表的头结点的next赋为空
readmassage(); //将之前的信息读取到结构体数组,商品链表,购物车链表中
interfaces(); //初始界面图形函数
choice(); //功能选择函数
return 0;
}
/* ***************************功能函数区域*********************************************** */
/*基础功能已经实现*/
int user_name_judgment(char *p) //用户姓名判断
{
if((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <='Z'))
{
p++;
while(*p)
{
if(!(isalpha(*p) || *p == '_' || isdigit(*p)))
return 0;
p++;
}
return 1;
}
else
return 0;
}
int user_password_judgment(char *p) //用户密码判定
{
int len; //长度判断
len = strlen(p);
if(len<6||len>12)
{
return 0;
}
int i=0; //字符有效性判断
for(; *p != '\0'; p++)
{
if(!( (*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <='Z')||(*p >='0' && *p <= '9'))) //判断字符是否有效
return 0;
}
return 1;
}
int manager_user_1() //用户管理——1.注册
{
if(count < 30)
{
printf("请输入注册姓名:");
fflush(stdin);
gets(user[count].name);
if(user_name_judgment(user[count].name)==0)
{
printf("注册名字存在格式问题!\n");
printf("是否再次注册Y,y/N,n?");
char choice_name;
scanf(" %c",&choice_name);
if(choice_name == 'Y' || choice_name == 'y')
{
manager_user_1();
}
else
{
printf("5s后返回用户管理界面");
Sleep(5000);
system("CLS");
manager_user();
}
}
printf("请输入注册密码:");
char repassword[13];
fflush(stdin);
gets(user[count].password);
if(!user_password_judgment(user[count].password))
{
printf("注册密码存在格式问题!\n");
printf("是否再次注册Y,y/N,n?");
char choice_password;
scanf(" %c",&choice_password);
if(choice_password == 'Y' || choice_password == 'y')
{
manager_user_1();
}
else
{
printf("5s后返回用户管理界面");
Sleep(5000);
system("CLS");
manager_user();
}
}
printf("请再次输入密码: "); //两次输入密码判断是否一样
fflush(stdin);
gets(repassword);
if(strcmp(user[count].password,repassword))
{
printf("\n两次输入的密码不一致!");
printf("是否再次注册Y,y/N,n?");
char choice_repassword;
scanf(" %c",&choice_repassword);
if(choice_repassword == 'Y' || choice_repassword == 'y')
{
manager_user_1();
}
else
{
printf("5s后返回用户管理界面");
Sleep(5000);
system("CLS");
manager_user();
}
}
printf("请输入您的爱好:");
fflush(stdin);
gets(user[count].interest);
printf("请输入您的工作:");
fflush(stdin);
gets(user[count].work);
printf("您的注册编号为:%d,这将是你的登录账号.\n注册成功!",count+1);
count++;
}
else
{
printf("注册用户数目已经达到上限,请联系后台管理员!!");
printf("5s后返回用户管理界面");
Sleep(5000);
system("CLS");
manager_user();
}
printf("\n5s后返回上一界面...");
Sleep(5000);
system("CLS");
manager_user();
return 0;
}
void manager_user_face() //用户管理函数界面
{
printf("☆ ◤***********************************************************◥ ☆ \n");
printf(" △ ┇ ___________ ┇ △ \n");
printf("☆ ┇ | -- -- | ┇ ☆ \n");
printf(" △ ┇ | | | \\ | ┇ △ \n"); //显示存在字符的格式问题,按照这样才对称
printf("☆ ┇ | |_| | _/ | ┇ ☆ \n");
printf(" △ ┇ | | ┇ △ \n");
printf("☆ ┇ |___________| ┇ ☆ \n");
printf(" △ ┇ 京 东 ┇ △ \n");
printf("☆ ┇ 在线购物管理系统 ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇ 用户管理 ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇ 1.注册 ┇ ☆ \n");
printf(" △ ┇ 2.登录 ┇ △ \n");
printf("☆ ┇ 3.修改密码 ┇ ☆ \n");
printf(" △ ┇ 4.退出 ┇ △ \n");
printf("☆ ┇ ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇ ┇ ☆ \n");
printf(" △ ┇ 西南石油大学 ┇ △ \n");
printf("☆ ┇ 廖冰翔版权所属 ┇ ☆ \n");
printf(" △ ┇************************************************************┇ △ \n");
printf("\n \n \n"); //空行
printf("----------------$---------$----------------$----------------$----------------$-----------------$----------------$----------------\n");
printf("系统使用--温馨提示:\n");
printf("→用户名在1-18之间,首字母为字母,后面必须为字母,数字或下划线在!!!\n");
printf("\t→密码应在6-12之间,密码只能包含字母和数字!!!\n");
printf("\t\t→爱好以26个小写字母组成或者数字小于12或长度小于8的汉字;\n");
printf("\t\t\t→工作以26个小写字母组成或者数字小于12或长度小于8的汉字;\n");
printf("----------------$---------$----------------$----------------$----------------$-----------------$----------------$----------------\n");
}
void manager_user() //用户管理函数
{
manager_user_face();
printf("please input your choice:");
int elect;
scanf(" %d",&elect);
switch (elect)
{
case 1:
manager_user_1();
break;
case 2:
manager_user_2();
break;
case 3:
manager_user_3();
break;
case 4:
manager_user_4();
break;
default:
system("CLS");
printf("输入错误,拜托你正经点...\n原谅你了,再来一次吧 ̄へ ̄\n");
manager_user();
}
}
void manager_user_2() //用户管理——2.登录
{
int account;
char repassword[13];
printf("请输入您的账号:");
scanf(" %d",&account);
fflush(stdin);
printf("请输入你的密码;");
gets(repassword);
if(!strcmp(user[account-1].password,repassword))
{
load = 1; //登录成功状态戳
printf("登录成功!\n");
printf("你的账号是%d\n你的注册姓名是%s\n你的爱好是:%s\n你的工作是:%s",account,user[account-1].name,user[account-1].interest,user[account-1].work);
printf("\n5s后返回用户管理!");
Sleep(5000);
system("CLS");
manager_user();
}
else
{
printf("\n账户密码不存在!5s后返回用户管理!");
Sleep(5000);
system("CLS");
manager_user();
}
}
void manager_user_3() //用户管理——3.修改密码
{
int account;
char repassword[13];
char repassword_2[13];
printf("请输入您的账号:");
fflush(stdin);
scanf(" %d",&account);
printf("请输入你的密码;");
fflush(stdin);
gets(repassword);
if(!strcmp(user[account-1].password,repassword))
{
printf("密码正确,输入修改密码:");
fflush(stdin);
gets(repassword);
if(user_password_judgment(repassword))
{
printf("请再次输入新密码:");
fflush(stdin);
gets(repassword_2);
if(!strcmp(repassword,repassword_2))
{
printf("您的密码修改成功!5s后返回用户管理!");
strcpy(user[account-1].password,repassword_2);
Sleep(5000);
system("CLS");
manager_user();
}
else
{
printf("第二次输入密码不一样,5s后返回用户管理");
Sleep(5000);
system("CLS");
manager_user();
}
}
else
{
printf("输入密码格式错误,5s后返回用户管理!");
Sleep(5000);
system("CLS");
manager_user();
}
}
else
{
printf("账号和密码不存在!\n5s后返回用户管理!");
Sleep(5000);
system("CLS");
manager_user();
}
}
void manager_user_4() //用户管理——4.退出
{
system("CLS");
interfaces();
choice();
}
//商品函数区域
int manager_goods_1() //录入商品
{
p_goods newbase, q; //newbase用于确定申请的空间是否分配成功
char select = 'Y';
for(;select=='y'||select=='Y';)
{
printf("是否录入商品信息?Y/y:"); //是否录入商品信息
fflush(stdin);//清除缓存区内容
scanf("%c",&select);
if(select!='y'&&select!='Y') break; //判断录入条件是否成立
newbase = (goods *)malloc(sizeof(goods)); //生成一个新的商品节点
if (!newbase) return ERROR; //分配未成功返回错误
//把新生成的节点添加到,商品链表结尾
q = L; //把q定位到商品结尾
while(q->next){
q = q->next;
}
q->next = newbase; //添加新节点
newbase->next = NULL; //给新节点的指针赋值
newbase->head = q;
q = q->next; //q指向新节点
printf("请输入商品编号:"); //商品信息录入
scanf(" %d",&q->NO);
printf("请输入商品名称:");
fflush(stdin); //清除缓存区
scanf(" %d",&q->name);
printf("请输入商品类别:");
scanf(" %d",&q->sort);
printf("请输入商品数目:");
scanf(" %d",&q->amount);
printf("请输入商品价格:");
scanf(" %lf",&q->price);
printf("录入结束!\n");
}
printf("5s后返回上层...");
Sleep(5000);
system("CLS");
fflush(stdin);
manager_goods();
}
void manager_goods_2() //商品排序
{
if(!L->next)
{
printf("未录入商品!!!");
printf("5s后返回上层...");
Sleep(5000);
system("CLS");
fflush(stdin);
manager_goods();
}
printf("请选择你的排序方式:1.商品编号 2.商品名称 3.商品类别\n序号:");
int select;
scanf(" %d",&select);
p_goods p, temp, q = L->next; //定义q指向链表的第一个商品, p指向q的后一个节点
if(select == 1 ) //按照商品编号排序
{
for(;q->next!=NULL;)
{
p = q->next;
do{ //确保了在最后一个节点时,依旧能进行交换,当需要交换最后一个节点时,存在 bug
if(q->NO > p->NO) //从小到大排序
{
if(q->next == p && p->next != NULL) //两个链表相邻情况,且不是表尾的情况
{
q->head->next = p;
p->head = q->head;
q->next = p->next;
p->next->head = q;
p->next = q;
q->head = p;
}
else if(q->next == p && p->next == NULL) //两个链表相邻情况,且是表尾的情况
{
q->head->next = p;
p->head = q->head;
p->next = q;
q->head = p;
q->next = NULL;
}
else if(q->next != p && p->next != NULL)//不相邻的情况,不是表尾
{
q->head->next = p; q->next->head = p;
p->head->next = q; p->next->head = q;
temp = q->head; q->head = p->head; p->head = temp;
temp = q->next; q->next = p->next; p->next = temp;
}
else if(q->next != p && p->next == NULL)//不相邻的情况,是表尾
{
q->head->next = p;
q->next->head = p;
p->head->next = q;
temp = q->head;
q->head = p->head;
q->head = temp;
p->next = q->next;
q->next = NULL;
}
}
p = p->next;
}while(p);
q = q->next;
if(!q) break;
}
q = L->next;//指向首元节点
printf(" 按照商品编号排序 \n");
printf("商品编号\t商品名称\t商品类别\t商品数量\t商品单价\n");
do{
printf("%d \t\t%d \t\t%d \t\t%d \t\t%.2lf \n",q->NO,q->name,q->sort,q->amount,q->price);
if(q->next==NULL) break;
q = q->next;
}while(1);
}
else if(select==2) //按照商品名称排序
{
for(;q->next!=NULL;)
{
p = q->next;
do{ //确保了在最后一个节点时,依旧能进行交换,当需要交换最后一个节点时,存在 bug
if(q->name > p->name) //从小到大排序
{
if(q->next == p && p->next != NULL) //两个链表相邻情况,且不是表尾的情况
{
q->head->next = p;
p->head = q->head;
q->next = p->next;
p->next->head = q;
p->next = q;
q->head = p;
}
else if(q->next == p && p->next == NULL) //两个链表相邻情况,且是表尾的情况
{
q->head->next = p;
p->head = q->head;
p->next = q;
q->head = p;
q->next = NULL;
}
else if(q->next != p && p->next != NULL)//不相邻的情况,不是表尾
{
q->head->next = p; q->next->head = p;
p->head->next = q; p->next->head = q;
temp = q->head; q->head = p->head; p->head = temp;
temp = q->next; q->next = p->next; p->next = temp;
}
else if(q->next != p && p->next == NULL)//不相邻的情况,是表尾
{
q->head->next = p;
q->next->head = p;
p->head->next = q;
temp = q->head;
q->head = p->head;
q->head = temp;
p->next = q->next;
q->next = NULL;
}
}
p = p->next;
}while(p);
q = q->next;
if(!q) break;
}
q = L->next;
printf(" 按照商品名称排序 \n");
printf("商品名称\t商品编号\t商品类别\t商品数量\t商品单价\n");
do{
printf("%d \t\t%d \t\t%d \t\t%d \t\t%.2lf \n",q->name,q->NO,q->sort,q->amount,q->price);
if(q->next==NULL) break;
q = q->next;
}while(1);
}
else if(select==3) //类别排序
{
for(;q->next!=NULL;)
{
p = q->next;
do{ //确保了在最后一个节点时,依旧能进行交换,当需要交换最后一个节点时,存在 bug
if(q->sort > p->sort) //从小到大排序
{
if(q->next == p && p->next != NULL) //两个链表相邻情况,且不是表尾的情况
{
q->head->next = p;
p->head = q->head;
q->next = p->next;
p->next->head = q;
p->next = q;
q->head = p;
}
else if(q->next == p && p->next == NULL) //两个链表相邻情况,且是表尾的情况
{
q->head->next = p;
p->head = q->head;
p->next = q;
q->head = p;
q->next = NULL;
}
else if(q->next != p && p->next != NULL)//不相邻的情况,不是表尾
{
q->head->next = p; q->next->head = p;
p->head->next = q; p->next->head = q;
temp = q->head; q->head = p->head; p->head = temp;
temp = q->next; q->next = p->next; p->next = temp;
}
else if(q->next != p && p->next == NULL)//不相邻的情况,是表尾
{
q->head->next = p;
q->next->head = p;
p->head->next = q;
temp = q->head;
q->head = p->head;
q->head = temp;
p->next = q->next;
q->next = NULL;
}
}
p = p->next;
}while(p);
q = q->next;
if(!q) break;
}
q = L->next;
printf(" 按照商品类别排序 \n");
printf("商品类别\t商品编号\t商品名称\t商品数量\t商品单价\n");
do{
printf("%d \t\t%d \t\t%d \t\t%d \t\t%.2lf \n",q->sort,q->NO,q->name,q->amount,q->price);
if(q->next==NULL) break;
q = q->next;
}while(1);
}
else
{
printf("没有这个选项哦...亲亲\n");
printf("5s后返回上层...");
Sleep(5000);
system("CLS");
fflush(stdin);
manager_goods();
}
printf("-----------------------------------------------------------------------------------------\n");
printf("10s后返回上层...");
Sleep(10000);
system("CLS");
fflush(stdin);
manager_goods();
}
void manager_goods_3_face() //商品购退初始界面
{
system("CLS");
printf("☆ ◤***********************************************************◥ ☆ \n");
printf(" △ ┇ ___________ ┇ △ \n");
printf("☆ ┇ | -- -- | ┇ ☆ \n");
printf(" △ ┇ | | | \\ | ┇ △ \n"); //显示存在字符的格式问题,按照这样才对称
printf("☆ ┇ | |_| | _/ | ┇ ☆ \n");
printf(" △ ┇ | | ┇ △ \n");
printf("☆ ┇ |___________| ┇ ☆ \n");
printf(" △ ┇ 京 东 ┇ △ \n");
printf("☆ ┇ 在线购物管理系统 ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇ 商品购退 ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇ 1.商品进货 ┇ ☆ \n");
printf(" △ ┇ 2.商品退货 ┇ △ \n");
printf("☆ ┇ ┇ ☆ \n");
printf(" △ ┇ 西南石油大学 ┇ △ \n");
printf("☆ ┇ 廖冰翔版权所属 ┇ ☆ \n");
printf(" △ ┇************************************************************┇ △ \n");
}
void manager_goods_3() //商品购退
{
int select;
manager_goods_3_face(); //初始界面
printf("输入选项:");
scanf(" %d",&select);
p_goods q = L->next;
printf("商品类别\t商品编号\t商品名称\t商品数量\t商品单价\n");
do{
printf("%d \t\t%d \t\t%d \t\t%d \t\t%.2lf \n",q->sort,q->NO,q->name,q->amount,q->price);
if(q->next==NULL) break;
q = q->next;
}while(1);
if(select==1)
{
int NO1, amount1;
printf("请输入进货商品编号:");
scanf(" %d",&NO1);
printf("请输入进货商品数量:");
scanf(" %d",&amount1);
q = L->next;
do{
if(q->NO==NO1) break;
q = q->next;
}while(1);
q->amount += amount1;
}
else if(select==2)
{
int NO2, amount2;
printf("请输入退货商品编号:");
scanf(" %d",&NO2);
printf("请输入退货商品数量:");
scanf(" %d",&amount2);
q = L->next;
do{
if(q->NO==NO2) break;
q = q->next;
}while(1);
q->amount -= amount2;
}
else
{
printf("没有这个选项哦...亲亲\n");
printf("5s后返回上层...");
Sleep(5000);
system("CLS");
fflush(stdin);
manager_goods_3();
}
q = L->next;
printf("商品类别\t商品编号\t商品名称\t商品数量\t商品单价\n");
do{
printf("%d \t\t%d \t\t%d \t\t%d \t\t%.2lf \n",q->sort,q->NO,q->name,q->amount,q->price);
if(q->next==NULL) break;
q = q->next;
}while(1);
printf("5s后返回上层...");
Sleep(5000);
system("CLS");
fflush(stdin);
manager_goods();
}
void manager_goods_4() //商品信息添加删除 /*不知道商品信息,输入错误选项会异常退出
{
p_goods q, p;
int select;
printf("请选择:1.添加商品信息 2.删除商品信息 *请输入 1或2 继续:");
scanf(" %d",&select);
if(select == 1)
{
q = L;
for(;1;)
{
if (q->next==NULL) break;
q = q->next;
}
p = q;
q->next =(goods *)malloc(sizeof(goods)); //生成一个商品节点指针
q = q->next;
printf("请输入商品编号:");
scanf(" %d",&q->NO);
printf("请输入商品名称:");
scanf(" %d",&q->name);
printf("请输入商品类别:");
scanf(" %d",&q->sort);
printf("请输入商品数目:");
scanf(" %d",&q->amount);
printf("请输入商品价格:");
scanf(" %lf",&q->price);
printf("录入结束!\n");
q->head = p;
q->next = NULL;
}
else if(select == 2)
{
int no;
printf("请输入所要删除的商品信息:");
scanf(" %d",&no);
q = L;
for(;1;)
{
if (q->NO == no) break;
q = q->next;
}
if(q->next == NULL) //删除最后一个节点
{
q->head->next = NULL;
}
else
{
q->head->next = q->next;
q->next->head = q->head;
}
free(q);
}
q = L->next; //遍历链表
printf("商品类别\t商品编号\t商品名称\t商品数量\t商品单价\n");
do{
if(!q) break; //如果没有元素,退出
printf("%d \t\t%d \t\t%d \t\t%d \t\t%.2lf \n",q->sort,q->NO,q->name,q->amount,q->price);
if(q->next==NULL) break;
q = q->next;
}while(1);
printf("10s后返回上层...");
Sleep(10000);
system("CLS");
fflush(stdin);
manager_goods();
}
void manager_goods_5() //商品信息修改 /*存在输入错误编号,程序异常退出的问题
{
p_goods q;
q = L->next; //遍历链表
printf("商品类别\t商品编号\t商品名称\t商品数量\t商品单价\n");
do{
printf("%d \t\t%d \t\t%d \t\t%d \t\t%.2lf \n",q->sort,q->NO,q->name,q->amount,q->price);
if(q->next==NULL) break;
q = q->next;
}while(1);
int no;
printf("输入你想修改的商品编号:");
scanf(" %d",&no);
q = L->next; //遍历链表
do{
if(q->NO==no) break;
q = q->next;
}while(1);
printf("请输入新的商品编号:");
scanf(" %d",&q->NO);
printf("请输入新的商品名称:");
scanf(" %d",&q->name);
printf("请输入新的商品类别:");
scanf(" %d",&q->sort);
printf("请输入新的商品数目:");
scanf(" %d",&q->amount);
printf("请输入新的商品价格:");
scanf(" %lf",&q->price);
q = L->next; //遍历链表
printf("新的商品类别\t商品编号\t商品名称\t商品数量\t商品单价\n");
do{
printf("%d \t\t%d \t\t%d \t\t%d \t\t%.2lf \n",q->sort,q->NO,q->name,q->amount,q->price);
if(q->next==NULL) break;
q = q->next;
}while(1);
printf("10s后返回上层...");
Sleep(10000);
system("CLS");
fflush(stdin);
manager_goods();
}
void manager_goods_6() //商品信息查找和浏览
{
p_goods q;
q = L->next; //遍历链表
printf("商品类别\t商品编号\t商品名称\t商品数量\t商品单价\n");
do{
printf("%d \t\t%d \t\t%d \t\t%d \t\t%.2lf \n",q->sort,q->NO,q->name,q->amount,q->price);
if(q->next==NULL) break;
q = q->next;
}while(1);
printf("10s后返回上层...");
Sleep(10000);
system("CLS");
fflush(stdin);
manager_goods();
}
void manager_goods_face() //商品管理函数界面
{
printf("☆ ◤***********************************************************◥ ☆ \n");
printf(" △ ┇ ___________ ┇ △ \n");
printf("☆ ┇ | -- -- | ┇ ☆ \n");
printf(" △ ┇ | | | \\ | ┇ △ \n"); //显示存在字符的格式问题,按照这样才对称
printf("☆ ┇ | |_| | _/ | ┇ ☆ \n");
printf(" △ ┇ | | ┇ △ \n");
printf("☆ ┇ |___________| ┇ ☆ \n");
printf(" △ ┇ 京 东 ┇ △ \n");
printf("☆ ┇ 在线购物管理系统 ┇ ☆ \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(" △ ┇ ┇ △ \n");
printf("☆ ┇ ┇ ☆ \n");
printf(" △ ┇ 西南石油大学 ┇ △ \n");
printf("☆ ┇ 廖冰翔版权所属 ┇ ☆ \n");
printf(" △ ┇************************************************************┇ △ \n");
printf("\n \n \n"); //空行
printf("----------------$---------$----------------$----------------$----------------$-----------------$----------------$----------------\n");
printf("系统使用--温馨提示:\n");
printf("→商品的编号、数量、单价:采用十进制数,规定最长宽度为8位;\n");
printf("\t→商品名称为26位字母组成字符串,长度为20位或者长度小于8的汉字\n");
printf("----------------$---------$----------------$----------------$----------------$-----------------$----------------$----------------\n");
}
void manager_goods() //商品管理函数
{
manager_goods_face();
printf("please input your choice:");
int elect;
scanf(" %d",&elect);
switch (elect)
{
case 1:
manager_goods_1(); //录入商品
break;
case 2:
manager_goods_2(); //商品排序
break;
case 3:
manager_goods_3(); //商品购退
break;
case 4:
manager_goods_4(); //商品信息添加删除
break;
case 5:
manager_goods_5(); //商品信息修改
break;
case 6:
manager_goods_6(); //商品信息查找和浏览
break;
case 7:
system("CLS");
interfaces();
choice();
break;
default:
system("CLS");
printf("输入错误,拜托你正经点...\n原谅你了,再来一次吧 ̄へ ̄\n");
manager_goods();
}
}
//退出系统功能区域
void exit_system() //退出系统
{
system("CLS");
printf("☆ ◤***********************************************************◥ ☆ \n");
printf(" △ ┇ ___________ ┇ △ \n");
printf("☆ ┇ | -- -- | ┇ ☆ \n");
printf(" △ ┇ | | | \\ | ┇ △ \n"); //显示存在字符的格式问题,按照这样才对称
printf("☆ ┇ | |_| | _/ | ┇ ☆ \n");
printf(" △ ┇ | | ┇ △ \n");
printf("☆ ┇ |___________| ┇ ☆ \n");
printf(" △ ┇ 京 东 ┇ △ \n");
printf("☆ ┇ 在线购物管理系统 ┇ ☆ \n");
printf("☆ ┇ ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇ 退出系统 ┇ ☆ \n");
printf(" △ ┇ 欢迎你的使用 ┇ △ \n");
printf("☆ ┇ 谢 谢 ! ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇ ┇ ☆ \n");
printf(" △ ┇ 廖冰翔版权所属 ┇ △ \n");
printf("☆ ┇ 西南石油大学 ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇ ┇ ☆ \n");
printf(" △ ┇ @LBX&&ZLL&&SWPU 2019 ┇ △ \n");
printf("☆ ┇ version 1.0 ┇ ☆ \n");
printf(" △ ┇ ALL Rights Reserved ┇ △ \n");
printf("☆ ┇************************************************************┇ ☆ \n");
printf(" △ ◣ 再见 ◢ △ \n");
}
//购物车的功能区域
int manager_shoppingcart_1() //商品添加
{
if(!load)
{
printf("未登录用户,请登录后再进行操作!\n");
Sleep(4000);
system("CLS");
fflush(stdin);
manager_shoppingcart();
}
p_goods q; //商品节点
p_shoppingcart newbase; //存储realloc的新生成的数据地址
q = L->next; //遍历链表
printf("商品类别\t商品编号\t商品名称\t商品数量\t商品单价\n");
do{
printf("%d \t\t%d \t\t%d \t\t%d \t\t%.2lf \n",q->sort,q->NO,q->name,q->amount,q->price);
if(q->next==NULL) break;
q = q->next;
}while(1);
int no, amount;
printf("输入你想要购买的商品编号:");
scanf(" %d",&no);
printf("输入你想要购买的商品数目:");
scanf(" %d",&amount);
q = L->next; //遍历链表,找到想购买的商品节点
do{
if(q->NO == no) break;
q = q->next;
}while(1);
q->amount -= amount;
p_shoppingcart j, i;
//遍历购物车链表,如果存在商品就添加数量,不存在商品就新生成节点
j = Lsc->next;
for(;1;)
{
if(j == NULL) //购物车没有商品的情况
{
newbase = (shoppingcart *)malloc(sizeof(shoppingcart)); //生成一个商品节点指针
if(!newbase) return ERROR;
newbase->next = NULL; //将j移动到下一个节点
newbase->head = Lsc;
Lsc->next = newbase;
j = newbase;
//商品信息拷贝到购物车
j->NO = q->NO;
j->name = q->name;
j->sort = q->sort;
j->amount = amount;
j->price = q->price;
break; //到最后一个节点,不存在就退出
}
if(j->NO == no) //存在添加商品数量
{
j->amount += amount;
break;
}
if(j->next == NULL) //到最后一个节点,不存在购物车商品,就添加新的商品节点
{
newbase = (shoppingcart *)malloc(sizeof(shoppingcart)); //生成一个商品节点指针
if(!newbase) return ERROR;
newbase->next = NULL; //将j移动到下一个节点
newbase->head = j;
j->next = newbase;
j = j->next;
//商品信息拷贝到购物车
j->NO = q->NO;
j->name = q->name;
j->sort = q->sort;
j->amount = amount;
j->price = q->price;
break; //到最后一个节点,不存在就退出
}
j = j->next;
}
printf("是否继续购买Y/y:");
char select;
scanf(" %c",&select);
if(select=='Y'||select=='y')
{
system("CLS");
fflush(stdin);
manager_shoppingcart_1();
}
else
{
system("CLS");
fflush(stdin);
manager_shoppingcart();
}
}
void manager_shoppingcart_2() //商品删除
{
if(!load)
{
printf("未登录用户,请登录后再进行操作!\n");
Sleep(4000);
system("CLS");
fflush(stdin);
manager_shoppingcart();
}
p_shoppingcart p, q;
q = Lsc->next; //遍历链表
printf("商品类别\t商品编号\t商品名称\t商品数量\t商品单价\n");
do{
printf("%d \t\t%d \t\t%d \t\t%d \t\t%.2lf \n",q->sort,q->NO,q->name,q->amount,q->price);
if(q->next==NULL) break;
q = q->next;
}while(1);
int no;
printf("请输入所要删除的商品信息:");
scanf(" %d",&no);
q = Lsc->next;
for(;1;)
{
if (q->NO == no) break;
q = q->next;
}
if(q->next == NULL) //删除最后一个节点
{
q->head->next = NULL;
}
else
{
q->head->next = q->next;
q->next->head = q->head;
}
free(q);
system("CLS");
fflush(stdin);
manager_shoppingcart();
}
void manager_shoppingcart_3() //查看已选商品,未考虑购物车不存在商品的情况
{
if(!load)
{
printf("未登录用户,请登录后再进行操作!\n");
Sleep(4000);
system("CLS");
fflush(stdin);
manager_shoppingcart();
}
p_shoppingcart q;
q = Lsc->next; //遍历链表
printf("商品类别\t商品编号\t商品名称\t商品数量\t商品单价\n");
do{
printf("%d \t\t%d \t\t%d \t\t%d \t\t%.2lf \n",q->sort,q->NO,q->name,q->amount,q->price);
if(q->next==NULL) break;
q = q->next;
}while(1);
printf("4s后返回上层...");
Sleep(4000);
system("CLS");
fflush(stdin);
manager_shoppingcart();
}
void manager_shoppingcart_face()
{
system("CLS");
printf("☆ ◤***********************************************************◥ ☆ \n");
printf(" △ ┇ ___________ ┇ △ \n");
printf("☆ ┇ | -- -- | ┇ ☆ \n");
printf(" △ ┇ | | | \\ | ┇ △ \n"); //显示存在字符的格式问题,按照这样才对称
printf("☆ ┇ | |_| | _/ | ┇ ☆ \n");
printf(" △ ┇ | | ┇ △ \n");
printf("☆ ┇ |___________| ┇ ☆ \n");
printf(" △ ┇ 京 东 ┇ △ \n");
printf("☆ ┇ 在线购物管理系统 ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇ 购物车管理 ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇ 1.商品添加 ┇ ☆ \n");
printf(" △ ┇ 2.商品删除 ┇ △ \n");
printf("☆ ┇ 3.查看已选商品 ┇ ☆ \n");
printf(" △ ┇ 4.返回 ┇ △ \n");
printf("☆ ┇ ┇ ☆ \n");
printf(" △ ┇ 西南石油大学 ┇ △ \n");
printf("☆ ┇ 廖冰翔版权所属 ┇ ☆ \n");
printf(" △ ┇************************************************************┇ △ \n");
}
void manager_shoppingcart() //购物车管理
{
manager_shoppingcart_face();
int select;
printf("输入选项:");
scanf(" %d",&select);
switch (select)
{
case 1:
manager_shoppingcart_1(); //商品添加
break;
case 2:
manager_shoppingcart_2(); //商品删除
break;
case 3:
manager_shoppingcart_3(); //查看已选商品
break;
case 4: //返回
system("CLS");
interfaces();
choice();
break;
default:
system("CLS");
printf("输入错误,拜托你正经点...\n原谅你了,再来一次吧 ̄へ ̄\n");
manager_shoppingcart();
}
}
//文件保存功能模块
void save_file() //保存了,用户信息、 商品信息、 购物车信息
{
//保存商品信息
FILE *fp;
if( (fp = fopen("E:\\Jingdong shopping system\\text\\goods_massage.txt","w+") ) == NULL) //以读写方式打开文件
{
printf("Failure to open goods_massage.txt!\n");
exit(0);
}
p_goods q;
q = L->next; //遍历链表
do{
if( q == NULL ) break;
fprintf(fp,"%d \t\t%d \t\t%d \t\t%d \t\t%.2lf \n",q->sort,q->NO,q->name,q->amount,q->price);
if(q->next==NULL) break;
q = q->next;
}while(1);
fclose(fp);
//保存用户信息
int i;
FILE *u_fp;
if( (u_fp = fopen("E:\\Jingdong shopping system\\text\\user_massage.txt","w+") ) == NULL )
{
printf("Failure to open user_massage.txt!\n");
exit(0);
}
for( i = 0;i < count ; i++)
{
fprintf(u_fp,"%s \t\t%s \t\t%s \t\t%s\n",user[i].name,user[i].password,user[i].interest,user[i].work);
}
fclose(u_fp);
//保存购物车信息
FILE *c_fp;
if( (c_fp = fopen("E:\\Jingdong shopping system\\text\\goods_cart.txt","w+") ) == NULL) //以读写方式打开文件
{
printf("Failure to open goods_massage.txt!\n");
exit(0);
}
p_shoppingcart p;
p = Lsc->next; //遍历链表
do{
if( p == NULL ) break;
fprintf(c_fp,"%d \t\t%d \t\t%d \t\t%d \t\t%.2lf \n",p->sort,p->NO,p->name,p->amount,p->price);
if(p->next==NULL) break;
p = p->next;
}while(1);
fclose(fp);
}
//初始界面和功能函数选择
void interfaces() //初始界面图形函数
{
printf("☆ ◤***********************************************************◥ ☆ \n");
printf(" △ ┇ ___________ ┇ △ \n");
printf("☆ ┇ | -- -- | ┇ ☆ \n");
printf(" △ ┇ | | | \\ | ┇ △ \n"); //显示存在字符的格式问题,按照这样才对称
printf("☆ ┇ | |_| | _/ | ┇ ☆ \n");
printf(" △ ┇ | | ┇ △ \n");
printf("☆ ┇ |___________| ┇ ☆ \n");
printf(" △ ┇ 京 东 ┇ △ \n");
printf("☆ ┇ 在线购物管理系统 ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇ 1.用户管理 ┇ ☆ \n");
printf(" △ ┇ 2.商品管理 ┇ △ \n");
printf("☆ ┇ 3.购物车管理 ┇ ☆ \n");
printf(" △ ┇ 4.退出系统 ┇ △ \n");
printf("☆ ┇ 5.保存文件 ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇ ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇ ┇ ☆ \n");
printf(" △ ┇ 西南石油大学 ┇ △ \n");
printf("☆ ┇ 廖冰翔版权所属 ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇ ┇ ☆ \n");
printf(" △ ┇ 保护正版,翻版必究 ┇ △ \n");
printf("☆ ┇ ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇ version 1.0 ┇ ☆ \n");
printf(" △ ┇ ┇ △ \n");
printf("☆ ┇************************************************************┇ ☆ \n");
printf(" △ ◣ 请选择菜单1-4 ◢ △ \n");
}
void choice() //功能选择函数
{
int elect;
printf("输入选项:");
scanf("%d",&elect);
system("CLS");
if(elect==1)
{
manager_user(); //用户管理函数
}
else if(elect==2)
{
manager_goods();//商品管理函数
}
else if(elect==3)
{
manager_shoppingcart(); //购物车管理
}
else if(elect==4)
{
exit_system(); //退出系统
}
else if(elect==5)
{
save_file(); //保存文件
}
else
{
printf("本程序很有选择,请不要无理调戏我!\n");
printf("要调戏请去找小姐姐ψ(*`ー′)ψ,3s后重新输入\n");
Sleep(3000);
system("CLS"); //清除当前屏幕内容
printf("请再次输入正确答案:\n");
interfaces();
choice();
}
}
/*附加功能*/
readmassage(){ //将之前的信息读取到结构体数组,商品链表,购物车链表中
//读取用户信息
FILE *fp;
int i;
if((fp = fopen("E:\\Jingdong shopping system\\text\\user_massage.txt","rb")) == NULL)
{
printf("Failure to open user_massage.txt!\n");
exit(0);
}
for (i=0;!feof(fp);i++)
{
fscanf(fp,"%s \t\t%s \t\t%s \t\t%s\n",user[i].name,user[i].password,user[i].interest,user[i].work);
}
fclose(fp);
printf("Total user is %d.\n",i-1);
Sleep(2000);
system("CLS");
count = i-1;
return i-1;
}