资源描述
软件学院
课程设计报告
设计名称: C语言课程设计
选题名称: 结账系统
姓 名: 王帅
学 号: 1515925717
专业班级: 云计算3班
系 (院): 软件学院
设计时间: 2015.12.26~2015.12.29
设计地点: 实验室15#508
一、系统设计
该程序设计主要利用了C语言的基本知识,程序的几乎全部工作都是由各个函数分别完成的。该小型结账系统主要实现了对管理员和客户的功能。以下就是程序实现的主要功能:
管理员的功能:
1.录入商品信息。
2.打印商品信息。
3.插入商品信息。
4.删除商品信息。
5.修改商品信息。
6.读出商品信息。
7.退出系统并保存和销毁。
客户的功能:
1. 查询商品信息。
2. 读出商品信息。
3. 求商品清单。
4. 查看商品的编号。
5. 退出系统并保存和销毁.
程序模块图如下:
结账系统
打印商品信息
录入商品信息
退出保存和销毁
插入商品信息
删除商品信息
修改商品信息
读出商品信息
退出保存和销毁
求取商品清单
读出商品信息
查询商品信息
查看商品编号
流程图:
管理员:
开始始始
输入n值
录入商输入品信息
i=
2
打印
是
插入
3
是
4
删除
是
修改
5
是
6
读出
是
0
结束
开始
客户:
查询
查看编号
4
3
1
菜单
读出
i=
是
商品清单
是
是
0
结束
录入流程图: 查询流程图:
i=1
无此商品
输出信息
输入编号
开始
输入n的值
i++
是否找到
录入信息
是 是 否
i<n
结束
插入流程图: 删除流程图:
开始
开始
输入编号
输入编号
是否找到
是否找到
插入
否 否
无此商品
删除信息
插入成功
无此商品
、
修改流程图: 销毁流程图:
开始
开始
销毁
输入编号
是否为空
是否找到
否 否
修改商品
无此商品
结束
二.详细设计
1.写出头文件
#include<stdio.h>
#include<stdlib.h>
2.利用宏定义申请空间的字符长度
#define N sizeof(struct good)
3.定义结构体变量
struct good
{
int num;
char name[20];
float price;
int quantity;
struct good *next;
};
4.创建一个头结点
struct good *tou() // 创建头结点
{
struct good *head;
head=(struct good *)malloc(N);
if(head==NULL)
{
printf("创建失败!\n");
exit(0);
}
head->next=NULL;
return head;
}
5.创建一个商品的链表,链表的长度自行定义,创建完成后返回头结点。
struct good *creat(struct good *head) //创建链表
{
int i=1,n;
struct good *q,*p;
head->next=NULL;
p=head;
printf("你想录入几个商品的信息\n");
scanf("%d",&n);
while(i<=n)
{
q=(struct good *)malloc(N);
printf("输入%d商品的编号\n",i);
scanf("%d",&q->num);
printf("输入%d商品的名称\n",i);
scanf("%s",q->name);
printf("输入%d商品的价格\n",i);
scanf("%f",&q->price);
printf("输入%d商品的数量\n",i);
scanf("%d",&q->quantity);
p->next=q;
p=q;
i++;
}
p->next=NULL;
return head;
}
6. 插入一个结点。输入你想插入在那个商品的编号,开始从头到尾寻找这个编号,找到了,插入进取,没有找到输出无此商品。
int insert(struct good *head) //插入
{
struct good *p,*q,*t,*w;
int num,i,j,m=1;
printf("你想插入那个商品的后面\n");
scanf("%d",&num);
p=head->next;
while(p!=NULL)
{
if(p->num==num)
{
t=(struct good *)malloc(N);
if(t==NULL)
{
printf("创建失败!!!\n");
exit(0);
}
t->next=NULL;
w=t;
while(i)
{
q=(struct good *)malloc(N);
printf("插入%d商品的编号\n",m);
scanf("%d",&q->num);
printf("插入%d商品的名称\n",m);
scanf("%s",q->name);
printf("插入%d商品的价格\n",m);
scanf("%f",&q->price);
printf("插入%d商品的数量\n",m);
scanf("%d",&q->quantity);
w->next=q;
w=q;
m++;
printf("是否继续插入?继续请按<1>,停止请按<0>\n");
scanf("%d",&j);
i=j;
}
w->next=p->next;
p->next=t->next;
printf("插入成功!!!\n");
return 0;
}
p=p->next;
}
}
7.删除。输入一个你想删除商品的编号。从头到尾开始寻找,找到了删除此编号,没有找到,则输出无此商品。
struct good *delete(struct good *head) //删除
{
struct good *p,*q;
int num;
printf("输入你想删除商品的编号\n");
scanf("%d",&num);
p=head;
while(p->num!=num && p->next!=NULL)
{
q=p;
p=p->next;
}
if(num==p->num)
{
q->next=p->next;
free(p);
printf("删除成功!! !\n");
}
else
{
printf("没有该商品!!!\n");
}
return head;
}
8.销毁链表。从头的下一个开始销毁链表,利用循环来销毁。
void destroy(struct good *head) //销毁链表
{
struct good *p,*q;
p=head->next;
q=NULL;
while(p!=NULL)
{
q=p;
p=p->next;
free(q);
}
free(p);
}
9.查询。输入一个商品的编号,从头到尾开始寻找,找到了输出寻找成功。
int Locate(struct good *head,int num) //查询
{
struct good *p;
p=head->next;
printf("商品编号 名称 价格 数量\n");
while(p!=NULL)
{
if(p->num==num)
{
printf(" %d %s %5.1f %d\n",p->num,p->name,p->price,p->quantity);
printf("寻找成功!!!\n");
return 1;
}
p=p->next;
}
return -1;
}
10.修改。输入一个商品的编号,开始从头到尾查找,找着了并修改,输出修改成功,没有找到则输出无此商品。
void shop(struct good *head,int num) //<修改>
{
struct good *p;
p=head;
while(p->num!=num && p->next!=NULL)
{
p=p->next;
}
if(p->num==num)
{
printf("输入商品的编号\n");
scanf("%d",&p->num);
printf("输入商品的名称\n");
scanf("%s",p->name);
printf("输入商品的价格\n");
scanf("%f",&p->price);
printf("输入商品的数量\n");
scanf("%d",&p->quantity);
printf("修改成功!!!\n");
}
else
{
printf("没有该商品!!!\n");
}
}
11.保存到二进制文件中
void save(struct good *head) //保存
{
FILE *fp;
struct good *p;
p=head->next;
if ((fp=fopen("20.txt","wb"))==NULL)
{
printf("文件打开失败!\n" );
exit (0);
}
while(p!=NULL)
{
if(fwrite(p,N,1,fp)!=1)
{
printf("文件保存失败!\n");
}
p=p->next;
}
fclose(fp);
printf("\n");
printf("文件保存成功!\n");
}
12.读出。打开文件,从文件中每读出一组数据放入刚创建的链表的结点中,读取完毕后,关闭文件,最后返回头结点。
struct good *read() //读出
{
FILE *fp;
struct good *p,*q,*head;
if((fp=fopen("20.txt","rb"))==NULL)
{
printf("error\n");
exit(0);
}
head=(struct good *)malloc(N);
head->next=NULL;
p=head;
q=(struct good*)malloc(N);
while(fread(q,N,1,fp)>0)
{
p->next=q;
p=q;
q=(struct good*)malloc(N);
}
p->next=NULL;
fclose(fp);
return head;
}
13.商品清单。客户输入商品的编号,便显示那一个商品的全部信息,再输入购买的数量和支付金钱后,清单上便显示你购买商品的数量,支付的金钱和找回的零钱。
void show(struct good *head,int num) //商品清单
{
struct good *p;
float t,sum1,sum2,sum;
p=head->next;
printf("商品编号 名称 价格 数量\n");
while(p!=NULL)
{
if(p->num==num)
{
printf("输入你想购买的数量\n");
scanf("%f",&t);
sum1=(p->price)*t;
printf("总价钱为:%5.1f\n",sum1);
printf("输入你支付金钱\n");
scanf("%f",&sum2);
sum=sum2-sum1;
printf("你购买商品的数量为:%5.1f 你支付金钱为:%5.1f 找回你的钱为:%5.1f\n",t,sum2,sum);
}
p=p->next;
}
}
14.打印出商品的编号,名称,价格,数量。
void print(struct good *head) //打印
{
struct good *p;
p=head->next;
printf("商品编号 名称 价格 数量\n");
while(p!=NULL)
{
printf(" %d %s %5.1f %d\n",p->num,p->name,p->price,p->quantity);
p=p->next;
}
}
15.查询商品的编号。
void judge(struct good *head)
{
struct good *p;
p=head->next;
printf("商品的编号\n");
while(p!=NULL)
{
printf("%d\n",p->num);
p=p->next;
}
}
16.管理员的菜单。
void menu1() // 管理员菜单
{
printf(" &&&&欢迎来到管理员的菜单&&&& \n");
printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<功能>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
printf(" 录入商品信息请按<1> \n");
printf(" 打印商品信息请按<2> \n");
printf(" 插入商品信息请按<3> \n");
printf(" 删除一个商品信息请按<4> \n");
printf(" 修改一个商品信息请按<5> \n");
printf(" 读出商品信息请按<6> \n");
printf(" 退出系统并保存请按<0> \n");
}
17.客户的菜单。
void menu2() // 客户菜单
{
printf(" &&&&欢迎来到客户的菜单&&&& \n");
printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<功能>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
printf(" 查询一个商品信息请按<1> \n");
printf(" 读出商品信息请按<2> \n");
printf(" 求商品清单请按<3> \n");
printf(" 查看商品的编号请按<4> \n");
printf(" 退出系统并保存请按<0> \n");
}
18.管理员功能的选择。
void f1() // 管理员选择的功能
{
int i,num;
struct good *p;
p=tou();
while(1)
{
menu1();
printf("请输入你想选择的功能\n");
scanf("%d",&i);
switch(i)
{
case 1:
creat(p);
break;
case 2:
print(p);
break;
case 3:
insert(p);
break;
case 4:
delete(p);
break;
case 5:
printf("输入你想修改商品的编号\n");
scanf("%d",&num);
shop(p,num);
break;
case 6:
p=read();
break;
case 0:
save(p);
destroy(p);
printf("《《《《《《《《《《《谢谢你的使用》》》》》》》\n");
exit(0);
}
}
}
19.客户功能的选择。
void f2() // 客户选择的功能
{
struct good *p;
int i,num;
p=tou();
while(1)
{
menu2();
printf("请输入你想选择的功能\n");
scanf("%d",&i);
switch(i)
{
case 1:
printf("输入你想查询商品的编号\n");
scanf("%d",&num);
Locate(p,num);
break;
case 2:
p=read();
break;
case 3:
printf("输入你想购买商品的编号\n");
scanf("%d",&num);
show(p,num);
break;
case 4:
judge(p);
break;
case 0:
save(p);
destroy(p);
printf("《《《《《《《《《《《谢谢你的使用》》》》》》》\n");
exit(0);
}
}
}
20. 设置管理员的密码
void w()
{
int i=1,t,j=123456;
char a[20],name[20]={"ws"};
printf("请输入管理员的帐号\n");
scanf("%s",a);
do
{
if(strcmp(a,name)!=0)
{
printf("请重新输入\n");
scanf("%s",a);
}
if(strcmp(a,name)==0)
{
printf("请输入管理员的密码\n");
scanf("%d",&t);
do
{
if(t!=j)
{
printf("请重新输入\n");
scanf("%d",t);
}
}while(t!=j);
}
}while(strcmp(a,name)!=0);
printf("登陆成功!!!\n");
}
21主函数。
int main()
{
int i;
printf("管理员登陆请按<1>,若是客户登陆请按<0>\n");
scanf("%d",&i);
if(i==1)
{
w();
f1();
}
if(i==0)
{
f2();
}
else
{
printf("对不起!没有此选择\n");
}
return 0;
}
三. 设计与调试分析
1. 首先在编写程序的时候将几个基本的函数写出来,例如添加、删除、查询、显示函数,在这几个程序能成功地运行出来之后,又一步一步编写我认为困难的函数。
2.
从一个文件中读出时要用到while循环,再循环里面又的创建一个又一个结点,把从文件中读出的数据一个一个的放入刚创建的链表中。这是创建链表与读出相结合而弄出来的,最后要关闭文件,返回头结点。
struct good *read()
{
FILE *fp;
struct good *p,*q,*head;
if((fp=fopen("20.txt","rb"))==NULL)
{
printf("error\n");
exit(0);
}
head=(struct good *)malloc(N);
head->next=NULL;
p=head;
q=(struct good*)malloc(N);
while(fread(q,N,1,fp)>0)
{
p->next=q;
p=q;
q=(struct good*)malloc(N);
}
p->next=NULL;
fclose(fp);
return head;
}
3.
客户要输入编号来查找这种商品的全部信息。如:价格,数量等。
如果客户直接输入商品的编号和数量的话,就会出现一个问题。你知道商品的数量有多少吗?所以必须先输入商品的编号,查看商品的数量,再来决定购买时的数量。输入数量后,就知道总价钱,再输入你支付的金额,就会出现找回你的零钱了。
void show(struct good *head,int num) //商品清单
{
struct good *p;
float t,sum1,sum2,sum;
p=head->next;
while(p!=NULL)
{
if(p->num==num)
{
printf("输入你想购买的数量\n");
scanf("%f",&t);
sum1=(p->price)*t;
printf("总价钱为:%5.1f\n",sum1);
printf("输入你支付金钱\n");
scanf("%f",&sum2);
sum=sum2-sum1;
printf("你购买商品的数量为:%5.1f 你支付金钱为:%5.1f 找回你的钱为:%5.1f\n",t,sum2,sum);
}
p=p->next;
}
}
4.
由于实验的功能有管理员和客户的,因此我必须把这两个分开来写,如果分开来写,我的主函数就会变得非常长,不宜找出错误和观看。因此我把管理员和客户所执行的功能,用函数分开来写就清晰多了。在主函数里调用他们就可以了。
void menu1() // 管理员菜单
{
printf(" &&&&欢迎来到管理员的菜单&&&& \n");
printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<功能>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
printf(" 录入商品信息请按<1> \n");
printf(" 打印商品信息请按<2> \n");
printf(" 插入商品信息请按<3> \n");
printf(" 删除一个商品信息请按<4> \n");
printf(" 修改一个商品信息请按<5> \n");
printf(" 读出商品信息请按<6> \n");
printf(" 退出系统并保存请按<0> \n");
}
void menu2() // 客户菜单
{
printf(" &&&&欢迎来到客户的菜单&&&& \n");
printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<功能>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
printf(" 查询一个商品信息请按<1> \n");
printf(" 读出商品信息请按<2> \n");
printf(" 求商品清单请按<3> \n");
printf(" 查看商品的编号请按<4> \n");
printf(" 退出系统并保存请按<0> \n");
}
void f1() // 管理员选择的功能
{
int i,num;
struct good *p;
p=tou();
while(1)
{
menu1();
printf("请输入你想选择的功能\n");
scanf("%d",&i);
switch(i)
{
case 1:
creat(p);
break;
case 2:
print(p);
break;
case 3:
insert(p);
break;
case 4:
delete(p);
break;
case 5:
printf("输入你想修改商品的编号\n");
scanf("%d",&num);
shop(p,num);
break;
case 6:
p=read();
break;
case 0:
save(p);
destroy(p);
printf("《《《《《《《《《《《谢谢你的使用》》》》》》》\n");
exit(0);
}
}
}
void f2() // 客户选择的功能
{
struct good *p;
int i,num;
p=tou();
while(1)
{
menu2();
printf("请输入你想选择的功能\n");
scanf("%d",&i);
switch(i)
{
case 1:
printf("输入你想查询商品的编号\n");
scanf("%d",&num);
Locate(p,num);
break;
case 2:
p=read();
break;
case 3:
printf("输入你想购买商品的编号\n");
scanf("%d",&num);
show(p,num);
break;
case 4:
judge(p);
break;
case 0:
save(p);
destroy(p);
printf("《《《《《《《《《《《谢谢你的使用》》》》》》》\n");
exit(0);
}
}
}
void w()
{
int i=1,t,j=123456;
char a[20],name[20]={"ws"};
printf("请输入管理员的帐号\n");
scanf("
展开阅读全文