资源描述
西 安 郵 電 學 院
高级语言课程设计报告书
系部名称
:
通信工程系
学生姓名
:
张青山
专业名称
:
通信工程
指导老师
:
宋 辉
班 级
:
通工0804
学号
:
03081126
时间
:
2009-5-25至2009-6-5
西安邮电学院
C语言程序设计实验报告
一 .实验目的
1.握结掌构体的定义和使用。
2.理解链表的工作原理,掌握基本操作。
3.熟悉C语言中文件操作相关函数。
4.了解超市管理的相关信息及处理方法。
5.加深对讲授内容的理解,尤其是一些语法规定。通过长时间,多次上机编程掌握语法规则与用法。
6.熟悉所用计算机系统的操作方法。
7.学会上机调试程序,也就是善于发现程序中的错误,并且能很快的排除这些错误,使程序能正常运行。
二、实验内容
通过定义主函数和简单的函数应用来实现对超市中商品的信息有一个合理的管理,并且使顾客只要进行简单的操作就能快捷,迅速的掌握想要了解的信息。给顾客带来方便,也减少管理人员的工作量。
三、需求分析
1.数据结构
(1)。定义一个结构体存储货物信息。结构体数据类型定义:
Struct item
{ Char brand [20];
Char id [10];
Float in_price;
Float out_price;
Int storage;
};
(2)。设计一个结构体存储购物车中的一条商品信息,该结构体嵌套了货物信息的结构体item.
Struct item_node
{ struct item wanted;
Int amount;
Struct item_node *next;
};
2. 函数定义
程序由头文件stdio.h,string.h,stdilb.h组成。然后分别定义一个结构体用于存储货物信息(包括:商品名,商品货号,进价,售价,存储量)。另一个则是用于存储购物车中的商品信息。函数申明则分别是对菜单,库存,购物车,添加商品,修改,结算等的申明。
3. 功能分析
(1)。库存模块:设计函数void establish(); 逐个输入货物信息包括:各商品的货号,货名,进价,售价,库存量的信息并存储在结构体数组goods[NUM]中,当作库存商品。在将数组写入文件.
(2)。输出全部商品模块:调用指针用写的方式打开存储货物的结构体数组,并显示库存商品的信息。
(3)。购物车模块:先定义指针struct item_node *cart来保存链表,在定义购物车的菜单(包括查询商品,显示当前购物列表,修改购物信息)。通过这一模块可以实现购物,修改所购商品,并确定是否购买。还能显示所购商品的菜单.若用户选择向购物车添加商品,则新建一个节点,将该商品信息存入节点中,在追加到链表的末尾,显示购物信息时,若指针不为空,逐一显示节点内容.
(4)。结算模块:先调用display()显示购物清单,逐一读取炼表cart中每一个节点的数据,计算商品总额。在输入实付金额后,显示应找余额。
(5)。显示商品信息模块:显示购物后商品的存储信息。
(6)。退出模块:选择该功能可退出该系统。
四、详细设计
菜单
建立库存
显示库存
购物车
结算
退出
购买商品
显示所购品
修改所购品
退出
存入goods[NUM]
开始输入
输入数字
1.建立库存
2.显示商品
3.购物车
4.结算
5.退出
输入商品
输入数字i
1.购物商品
2.显示商品
3.修改
4.退出
1<=i&&i<=4
购物商品
输入货物或货号
i
输入数量n
n>goods[i].storage
购买?
存在?
购买?
输出i,n
继续?
结束
是
是
是
否
是
否
否
是
否
否
Choice 1:
注:详细的设计流程图如上。
在建立库存信息模块时,设计函数void establish( );并将逐个输入的信息保存在结构数组goods[NUM],在将数组写入文件.
在显示所有商品时用指针以写的方式打开goods[NUM]。从而显示商品。
当选择3进入购物车模块购物时有4个模块供选择流程图如上。
Choice 2: 显示商品模块时,定义指针struct item_node *cart来保存所购商品。打印商品信息。
Choice 3:对cart中商品进行修改,若放弃购买哪一种商品将其删除。
Choice 4: 退出
当选择4进入结算模块时首先调用函数display( )显示清单,逐一打印链表cart中每一节点数据,计算价格输入金额,计算余额。
五、概要设计及运行结果
1.显示菜单:菜单内容由5部分构成,进行数字选择后将进入不同的功能区。如下显示:
2.选择数字1时将进入建立库存信息模块,开始建立库存如下:
3.当库存建立完毕后,选择主菜单2时,将显示所有库存信息。
4.按任意键将返回主菜单。如要购物选择3进入购物车模块:
将显示4项功能,选择数字进入。如下显示:
5.若选择1时将进入购物菜单,系统会提醒输入所需商品的品名或品号,便可以找到所需商品,系统会输出所需的商品数量是否购买的提示。
6.当选择2时,将显示顾客所购货物的清单。如果决定修改自己的商品,选择3进入修改购物信息模块,在这一模块中你可以选择删除所购买的某件商品或是修改商品数量,或可以重新购买。
7.重新确定商品选择4将退出购物车模块,并返回到主菜单。
8.在主菜单中选择4将进入结算模块,系统会显示你所购买商品的清单,并会显示总计金额,在输入支付金额后,系统会显示余额。交易完成后将退出进行下一次的操作。
六、调试情况,总结及体会
调试情况:
我采用的是先将所有的程序写好后在调试。在调试阶段,一开始我出现了102处错误,原因是函数声明出现错误,改过后便只剩下几个错。再将所有的错改掉后,编译成功。我的主菜单并没有问题,但就是修改信息模块有问题,原有信息无法删除。在老师与同学的帮助下得以将所有功能实现。
心得及体会:
首先我认为这次实习是成功的。对于我而言,其成功主要表现在两个方面上:一是对C语言这门课程自己又上了一个高度;二是磨砺了自己的意志品质。
通过两周的上机编程,对我C语言这门课程的帮助也是十分明显的。记得在实习之前我们总感觉C很难学,作业很难做,老师说我们是“欠练”。为此给我们安排了很多上机机会,上机时我们也就是按着课本的例题输入一显示结果就草草了事,也没有自己编程序。感觉对自己没什么提高。而就在这两周实习编程期间,我需要自己先构思,并且自己独立编程,并将自己的想法通过编程而实现。第一天感觉很茫然,不知从何处开始下手,也没有一个具体的构思。在听取老师意见后,开始认真构思自己的系统,并初步有了一些大框架,再将大框架划分为一个个小框架,然后将小框架通过简单的程序来实现。也就是在编程过程中我不的不将C语言课本上没搞懂的东西重新学习,如:结构体,数组等。在打开文件时需要用到指针,而这块内容我们还没学,就只能先自学。在运行时出现的错误便是对所学东西用法的错误。通过改错便能掌握其真确的用法。这对我C语言的提升起到了重要作用。
在运行结果时会反复出错,因此需要一点一点的改,这就需要极大的耐性与意志。即使一个“;”漏掉都不行。
调试程序固然可以借鉴他人的现成经验,但更重要的是通过自己的直接实践来积累经验,而且有的经验只能”意会”难以”言传”.别人的经验不能代替自己的经验.
上机的前一天先写好程序,以提高上机效率.
七.源代码
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define NUM 2
struct item
{ char brand[20];
char id[10];
float in_price;
float out_price;
int storage;
};
struct item_node
{ struct item wanted;
int amount;
struct item_node *next;
};
int menu();
void establish ();
void dis_all ();
void add ();
void delete ();
void shop_cart ();
int cart_menu ();
void display ();
void calculate();
struct item goods[NUM] ;
struct item_node *cart;
void main()
{ printf("\n\n\n *****************欢迎进入超市管理系统***************\n\n\n");
while(1)
{
switch (menu())
{
case 1:
establish() ;
break;
case 2:
dis_all();
break;
case 3:
shop_cart();
break;
case 4:
calculate();
break;
case 5:
printf("感谢使用,再见!\n");
}
}
}
int menu(){
char str[5];
int choice;
printf("\n\n请选择数字进行操作\n");
printf("----------------------------\n");
printf(" 1. 建立库存信息\n\n");
printf(" 2. 显示所有商品\n\n");
printf(" 3. 购物车\n\n");
printf(" 4. 结算 \n\n");
printf(" 5. 退出\n\n");
printf("-----------------------------\n");
printf("请选择(1-5):");
while(1){
fflush(stdin);
gets(str);
choice=atoi(str);
if(choice>5||choice<1)
printf("error!,请重新输入:");
else
break;
}
return choice;
}
void establish ()
{ FILE *fp;
int i;
printf("请依次输入货物信息:\n");
printf("-----------------------\n");
for(i=0;i<NUM; i++)
{printf("品名:\n");
fflush(stdin);
gets(goods[i].brand);
printf("货号:\n");
fflush(stdin);
gets(goods[i].id);
printf("进价:\n");
fflush(stdin);
scanf("%f",&goods[i].in_price);
printf("售价:\n");
fflush(stdin);
scanf("%f",&goods[i].out_price);
printf("数量:\n");
fflush(stdin);
scanf("%d",&goods[i].storage);
printf("\n");
}
if((fp=fopen("goods","w"))==NULL)
{printf("创建文件失败。\n");
return;
}
fwrite(goods,sizeof(struct item),NUM,fp);
fclose(fp);
}
void dis_all()
{ int i;
FILE *fp;
fp=fopen("goods","r");
for(i=0;(fwrite(goods+i,sizeof(struct item ),1,fp))!=0;i++);
{printf("-----------------------\n");
printf("货号 品名 单价 库存量\n");
printf("%3s%6s%10.2f%9d\n",goods[i].id,goods[i].brand,goods[i].out_price,goods[i].storage);
}
fwrite(goods,sizeof(struct item),NUM,fp);
fclose(fp);
}
void shop_cart()
{ while(1) {switch (cart_menu()){
case 1:
add();
break;
case 2:
display();
break;
case 3:
delete ();
case 4:
return;
}
}
}
int cart_menu()
{ char str[5];
int choice;
printf("\n 请选择操作 \n");
printf("--------------------------\n");
printf("1. 购物商品\n");
printf("2. 显示当前购物列表\n");
printf("3. 修改购物信息\n");
printf("4. 退出\n");
printf("--------------------------\n");
printf("请选择对应的数字1-4\n");
while(1) { gets(str);
choice=atoi(str);
if(choice<1||choice>4)
printf("请重新输入:");
else
break;
}
return choice;
}
void display()
{ struct item_node *p=cart;
if(p==NULL){
printf("购物车为空\n");
return;
}
while (p!=NULL){
printf("----------------------------\n");
printf(" 货号 品名 单价 数量\n ");
printf("%3s%6s%10.2f%9d\n",p->wanted.id,p->wanted.brand,
p->wanted.out_price,p->amount);
p=p->next;
}
}
void add() {
FILE *fp;
int i,n;
char str[20];
char choice1,choice2;
struct item_node *p,*p1;
do {
printf("输入所需物品的名称或货号:\n");
fflush(stdin);
gets(str);
if((fp=fopen("goods","r"))==NULL){
printf("打开文件失败\n");
continue;
}
for(i=0;fread(goods+i,sizeof(struct item),1,fp)!=0;i++){
if((strcmp (goods[i].brand,str)==0||strcmp(goods[i].id,str)
==0)&&goods[i].storage!=0){
printf("已找到所需物品 : \n");
printf("----------------------------------\n");
printf("货号 品名 单价 库存量 \n");
printf("%3s%6s%10.2f%9d\n",goods[i].id,goods[i].brand,
goods[i].out_price,goods[i].storage);
printf("请输入所需数量:");
scanf("%d",&n);
if(n>goods[i].storage){
printf("库存不足\n");
break;
}
printf("\n 是否购买?(Y/N)");
fflush(stdin);
choice1=getchar();
if(choice1=='Y'||choice1=='y'){
p1=(struct item_node*)malloc(sizeof(struct item_node));
if(p1==NULL){
printf("内存申请失败!\n");
exit(1);
}
p1->amount=n;
p1->wanted=goods[i];
p1->next=NULL;
p=cart;
if(cart==NULL)
cart=p1;
else {
while(p->next!=NULL)
p=p->next;
p1->next=p->next;
p->next=p1;
}
}
break;
}
}
if(i==NUM)
printf("未找到所需物品\n");
fclose(fp);
printf("是否继续购物?(N/Y)");
fflush(stdin);
choice2=getchar();
}while(choice2=='Y'||choice2=='y');
}
void delete ()
{ int i,j,k,choice;
struct item_node *p=cart;
if(p==NULL){
printf("无货物需修改\n");
return;
}
while (p!=NULL){
printf("----------------------------\n");
printf(" 货号 品名 单价 数量\n ");
printf("%3s%6s%10.2f%9d\n",p->wanted.id,p->wanted.brand,
p->wanted.out_price,p->amount);
p=p->next;
}
{ printf("请输入要删除的货物货名:\n");
scanf("%d",&k);
for(i=0;i<NUM;i++)
if(NUM>=k)
{ for (j=i;j<NUM;j++)
goods[NUM]=goods[NUM+1];
printf("\n\n删除完毕");
break;
}
if(i=NUM)
{printf("\n没有此商品!");
getchar();
}
printf("\n是否继续?()Y/N:");
flushall();
scanf("%c",&choice);
if(choice=='Y'||choice=='y')
printf("\n继续!");
else
return;
}
}
void calculate()
{float total=0,pay,yu;
struct item_node *p;
int i;
FILE *fp;
printf("以下是购物清单 :\n");
display();
if((fp=fopen("goods","r"))==NULL)
{printf("打开文件失败.\n");
return;
}
for(i=0;(fwrite(goods+i,sizeof(struct item),1,fp))!=0;i++);
fclose(fp);
p=cart;
while (p!=NULL)
{ total+=p->wanted.out_price*p->amount;
for(i=0;strcmp(goods[i].id,p->wanted.id)!=0;i++);
goods[i].storage-=p->amount;
p=p->next;
}
printf("总计 %7.2f",total);
printf("\n输入实付金额:");
scanf("%f",&pay);
yu=pay-total;
printf("余额 %7.2f",yu);
if((fp=fopen("goods","w"))==NULL)
{ printf("打开文件失败.\n");
return;
}
fwrite(goods,sizeof(struct item),NUM,fp);
fclose(fp);
}
展开阅读全文