功能:
界面友好(良好的人机交互)。
1.输入商品信息并保存至文件(包括商品编号、商品名称、商品型号、商品价格、商品产地、库存数量和已订购数量等,至少包括10种产品供顾客选择)。
2.使用链表实现商品的增、删、改功能,并把更新后的信息保存至文件。
3.查询商品功能,如输入商品名称、商品型号等。
4.选购流程:所选商品编号—列出对应商品的信息—要求顾客输入邮寄地址信息—确认订购,是否继续选购其它商品,列出所有选订商品,再次确认订购。
5.订购信息保存至文件。
6.每天订购统计功能,并能根据输入的数据显示低于或高于此数据的商品信息。
如下:
shangpin.txt内容(只写了几个示例)
100 哇哈哈 矿泉水 1.00 崂山 9996 4
101 农夫山泉 矿泉水 2.00 崂山 10000 0
102 可比克 零食 5.00 福建 9998 2
103 可比克2 零食 5.00 福建 9998 2
104 可比克3 零食 5.00 福建 9998 2
105 可比克 零食 5.00 福建 9998 2
106 牛肉粒 零食 32.00 内蒙古 2000 0
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义商品结构体
typedef struct _shangping
{
int bh; //编号
char name[30]; //名称
char xh[20]; //型号
float price; //价格
char chandi[10]; //产地
int kc; //库存
int ydg; //已订购数量
}ShangpinInfo;
//定义链表节点
typedef struct _stNode
{
ShangpinInfo product;
struct _stNode* next;
}LinkNode;
//保存订购信息
typedef struct _dginfo
{
int bh[20]; //商品编号
int cnt[20]; //商品订购数量
int nmb; //实际订购商品的种类数量
char addr[40]; //订购人地址
char phone[12];//订购人电话
}Dginfo;
Dginfo g_dginfo[100]; //定义全局变量保存订购信息
int g_dgNmb = 0; //定义全局变量,保存订购信息数量
//从文件中读取商品信息
LinkNode* ReadFile(const char* name)
{
LinkNode* head,*p,*t;
FILE* fp = 0;
if ((fp=fopen(name,"r"))==0)
{
printf("读取商品信息失败...\n");
return 0;
}
head = (LinkNode*)malloc(sizeof(LinkNode));
head->next = NULL;
p = head;
//读取文件
while(!feof(fp))
{
//逐行读取文件
t = (LinkNode*)malloc(sizeof(LinkNode));
t->next = NULL;
fscanf(fp,"%d %s %s %f %s %d %d\n",&t->product.bh,t->product.name,t->product.xh,&t->product.price,t->product.chandi,&t->product.kc,&t->product.ydg);
if(t->product.bh > 0) //避免读取到空行
{
p->next = t;
p = t;
}else
{
free(t); //空行,读取错误,释放空间
t = 0;
}
}
return head; //返回链表头
}
//更新商品信息文件
void UpdateFile(const char* name,LinkNode* head)
{
LinkNode*t;
FILE* fp = 0;
if(head == 0) return;
if ((fp=fopen(name,"w"))==0)
{
printf("读取商品信息失败...\n");
return ;
}
t = head->next;
while(t)
{
if(t->next)
fprintf(fp,"%d %s %s %.2f %s %d %d\n",t->product.bh,t->product.name,t->product.xh,t->product.price,t->product.chandi,t->product.kc,t->product.ydg);
else //最后一行不写入回车符
fprintf(fp,"%d %s %s %.2f %s %d %d",t->product.bh,t->product.name,t->product.xh,t->product.price,t->product.chandi,t->product.kc,t->product.ydg);
t = t->next;
}
fclose(fp);
}
//添加商品
LinkNode* Addshangpin(LinkNode* head)
{
LinkNode* p,*t;
system("cls");
//如果头为空,则创建
if (head == 0)
{
head = (LinkNode*)malloc(sizeof(LinkNode));
head->next = NULL;
}
p = head;
while(p->next)
{
p = p->next;
}
fflush(stdin);
//尾插法
t = (LinkNode*)malloc(sizeof(LinkNode));
t->next = NULL;
printf("请输入商品编号:");
scanf("%d",&t->product.bh); getchar();
printf("请输入商品名称:");
scanf("%s",t->product.name); getchar();
printf("请输入商品型号:");
scanf("%s",t->product.xh); getchar();
printf("请输入商品价格:");
scanf("%f",&t->product.price); getchar();
printf("请输入商品产地:");
scanf("%s",t->product.chandi);
printf("请输入商品库存:");
scanf("%d",&t->product.kc);
printf("请输入商品的已订购数量:");
scanf("%d",&t->product.ydg);
p->next = t;
printf("商品添加成功\n");
system("pause");
return head;
}
//删除商品
LinkNode* Delshangpin(LinkNode* head)
{
LinkNode* p,*t;
int id;
system("cls");
fflush(stdin);
printf("请输入需要删除的商品编号:");
scanf("%d",&id);
p = head;
while (p->next)
{
if (p->next->product.bh == id)
{
printf("商品已删除\n");
system("pause");
t = p->next;
p->next = t->next;
free(t);
t = 0;
return head;
}
p = p->next;
}
printf("未找到该商品\n");
system("pause");
return head;
}
//修改商品信息
LinkNode* Modshangpin(LinkNode* head)
{
LinkNode* p;
int id;
fflush(stdin);
system("cls");
printf("请输入需要修改的商品编号:");
scanf("%d",&id);
p = head->next;
while (p)
{
if (p->product.bh == id)
{
printf("请输入商品名称:");
scanf("%s",p->product.name); getchar();
printf("请输入商品型号:");
scanf("%s",p->product.xh); getchar();
printf("请输入商品价格:");
scanf("%f",&p->product.price); getchar();
printf("请输入商品产地:");
scanf("%s",p->product.chandi);
printf("请输入商品库存:");
scanf("%d",&p->product.kc);
printf("请输入商品的已订购数量:");
scanf("%d",&p->product.ydg);
printf("商品信息已修改完成\n");
system("pause");
return head;
}
p = p->next;
}
printf("未找到该商品\n");
system("pause");
return head;
}
//查询商品
LinkNode* Findshangpin(LinkNode* head)
{
LinkNode* p;
char buf[30]={0};
fflush(stdin);
system("cls");
if (head == 0)
{
printf("目前暂无商品\n");
system("pause");
return 0;
}
printf("请输入要查询的商品名称或者型号:");
scanf("%s",buf);
p = head->next;
printf("编号 名称 型号 价格 产地 库存 已订购\n");
while (p)
{
if (strcmp(p->product.name,buf)==0 || strcmp(p->product.xh,buf)==0)
{
printf("%4d %s %s %.2f %s %d %d\n",p->product.bh,p->product.name,p->product.xh,p->product.price,p->product.chandi,p->product.kc,p->product.ydg);
system("pause");
return p;
}
p = p->next;
}
printf("未找到该名称或者型号的商品\n");
system("pause");
return 0;
}
//显示所有商品
void showAll(LinkNode* head)
{
LinkNode* p;
system("cls");
if(head==0)
{
printf("目前暂无商品\n");
return;
}
p = head->next;
printf("编号 名称 型号 价格 产地 库存 已订购\n");
while (p)
{
printf("%4d %s %s %.2f %s %d %d\n",p->product.bh,p->product.name,p->product.xh,p->product.price,p->product.chandi,p->product.kc,p->product.ydg);
p = p->next;
}
system("pause");
return ;
}
//订购信息写入文件
void UpdateDginfo(const char* name)
{
int i,j;
FILE* fp;
if((fp = fopen(name,"w")) == 0)
{
printf("文件打开失败\n");
return;
}
for (i=0;i<g_dgNmb;i++)
{
//订购商品编号
for(j=0;j<g_dginfo[i].nmb;j++)
{
//订购商品编号
if(j< g_dginfo[i].nmb-1)
fprintf(fp,"%d,",g_dginfo[i].bh[j]);
else
fprintf(fp,"%d ",g_dginfo[i].bh[j]);
}
//对应的数量
for(j=0;j<g_dginfo[i].nmb;j++)
{
if(j< g_dginfo[i].nmb-1)
fprintf(fp,"%d,",g_dginfo[i].cnt[j]);
else
fprintf(fp,"%d ",g_dginfo[i].cnt[j]);
}
//收件人信息
fprintf(fp,"%s %s\n",g_dginfo[i].addr,g_dginfo[i].phone);
}
fclose(fp);
}
//订购商品
void Shopping(LinkNode* head,const char* name)
{
LinkNode* p;
int id,cnt=0;
char ch;
char addr[30];
Dginfo dg;
dg.nmb = 0;
fflush(stdin);
system("cls");
if(head==0)
{
printf("目前暂无商品\n");
return ;
}
while(1)
{
printf("请输入需要订购的商品编号:");
scanf("%d",&id);
p = head->next;
while(p && p->product.bh != id)
p = p->next;
if(p)
{
printf("请输入订购数量:");
scanf("%d",&cnt);
p->product.ydg += cnt;
//订购后是否需要从库存中减去?如果库存小于订购数量怎么处理?
//这里暂时不考虑那么复杂,只是单纯的从库存中减去订购数量
p->product.kc -= cnt; //减去订购数量
dg.bh[dg.nmb] = id;
dg.cnt[dg.nmb] = cnt;
dg.nmb++;
}else
printf("未找到该商品,");
printf("是否继续订购(Y/N):");
fflush(stdin);
ch = getchar();
if(ch == 'Y' || ch == 'y')
continue;
else
break;
}
fflush(stdin);
printf("请输入收件人地址:");
scanf("%s",&dg.addr); getchar();
printf("请输入收件人电话:");
scanf("%s",&dg.phone);
getchar();//接收回车符
g_dginfo[g_dgNmb] = dg;
g_dgNmb++;
//更新订购信息
UpdateFile(name,head); //更新库存文件
//订购信息写入文件
UpdateDginfo("dg.txt");
}
//统计每天的订购信息,订购信息保存到了 g_dginfo全局变量中,可以考虑写入到文件
void Tongji()
{
//按照产品编号统计
int product[100][2] = {0};
int nmb = 0;
int i,j,k,id;
int op,cnt=0;
system("cls");
fflush(stdin);
//统计每种商品的订购信息
for (i=0;i<g_dgNmb;i++)
{
for (j=0;j<g_dginfo[i].nmb;j++)
{
id = g_dginfo[i].bh[j];
//查找编号是否已经存在
for (k=0;k<nmb;k++)
{
if(product[k][0] == id)
break;
}
if (k == nmb)
{
product[nmb][0] = id;
product[nmb][1] = g_dginfo[i].cnt[j];
nmb++;
}else
product[k][1] += g_dginfo[i].cnt[j];
}
}
//显示所有订购信息
while(1)
{
system("cls");
printf("1.显示所有订购信息\n");
printf("2.显示特定数量的订购信息\n");
printf("3.退出统计\n");
scanf("%d",&op);
if(op == 3)
{
//system("pause");
return ;
}
else if(op == 2 || op == 1)
{
cnt = 0;
if(op == 2)
{
printf("请输入指定数量:");
scanf("%d",&cnt);
}
printf("编号 数量\n");
for (i=0;i<nmb;i++)
{
if(product[i][1] > cnt)
printf("%d %d\n",product[i][0],product[i][1]);
}
system("pause");
}
}
}
//释放内存
void Release(LinkNode* head)
{
LinkNode* p;
while (head)
{
p = head->next;
free(head);
head = p;
}
}
int main()
{
int op;
LinkNode* head = 0;
head = ReadFile("shangpin.txt");
while(1)
{
system("cls");
printf("1.显示所有商品信息\n");
printf("2.新增商品\n");
printf("3.修改商品信息\n");
printf("4.删除商品\n");
printf("5.订购商品\n");
printf("6.统计订购商品\n");
printf("7.查找商品\n");
printf("0.退出程序\n");
scanf("%d",&op);
switch(op)
{
case 0:
printf("谢谢使用,再见\n");
system("pause");
return 0;
case 1:
showAll(head);
break;
case 2:
head = Addshangpin(head);
UpdateFile("shangpin.txt",head);
break;
case 3:
head = Modshangpin(head);
UpdateFile("shangpin.txt",head);
break;
case 4:
head = Delshangpin(head);
UpdateFile("shangpin.txt",head);
break;
case 5:
Shopping(head,"shangpin.txt");
break;
case 6:
Tongji();
break;
case 7:
Findshangpin(head); //可以返回商品的指针
break;
}
}
//释放内存
if(head)
{
Release(head);
head = 0;
}
return 0;
}