cC语言物品管理-设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《C 语言物品管理》
课程设计报告
题目:
C 语言物品管理 专业:
网络工程 班级:
16级(3)班 姓名:
代应豪 指导教师:
代美丽
成绩:
计算机学院
2017 年 4月 27 日
2016-2017学年 第2学期
目录
1设计内容及要求 (2)
1.1概述 (2)
1.2主要功能 (2)
1.3设计目的及具体要求 (2)
2 概要设计 (2)
2.1系统的功能简介 (2)
2.2 总体程序框图 (3)
2.3各个模块之间的主要关系 (3)
3设计过程及程序代码 (3)
3.1定义结构体及宏定义 (4)
3.2主函数 main() (4)
3.3输入物品信息函数................................................... (5)
3.4输出显示物品函数 (5)
3.5将物品写入磁盘 (6)
3.6插入物品记录函数 (7)
3.7 删除一个物品记录函数 (7)
3.8按照物品编号进行递增排序函数 (8)
3.9按照物品总价进行递增排序函数 (8)
3.10对物品记录进行排序函数 (9)
3.11输出头部信息函数 (10)
3.12输出一条物品信息函数....................................... .. (10)
3.13判断该编号物品是否存在函数 (10)
3.14根据物品编号进行查找函数 (10)
3.15根据物品名字进行查找函数 (10)
3.16对物品记录进行查找函数 (11)
4设计结果与分析 (12)
4.1各个模块的程序流程图 (12)
1)①主函数程序(N-S)流程图及运行界面 (12)
2)①输入物品记录信息的(N-S)流程图及程序运行界面.......... .. (13)
5设计心得 (21)
6参考文献 (22)
7源程序代码(物品管理系统) (23)
1.设计内容及要求
1.1概述
《物品管理系统》主要根据课程设计要求进行设计,从对物品的简单处理着手设计一份物品管理系统。

1.2主要功能
物品管理系统是一个针对物品管理的系统。

该系统功能主要包括八大模块:
1)插入物品记录:输入物品个数,根据物品个数依次输入每个物品记录的详细信息。

例如物品编号、名字、单价、数量。

2)输出物品记录:对已经写入磁盘的记录信息的显示。

如无数据,则显示无数据!
3)将物品记录写入文件。

4)插入一个物品记录。

5)删除一个物品记录。

6)对物品记录进行排序。

7)对物品记录进行查找。

8)退出系统。

1.3设计目的及具体要求
主要利用C语言的文件操作能力设计开发一个小型的信息
系统,至少具有如下功能:物品的读和写、物品信息的增删改、物品信息的排序、查找。

操作界面要符合用户的一般习惯,图形或文本界面都可以。

要求:系统以菜单方式工作,根据菜单项序号提示进行工作。

物品信息包括编号看、名称、单价、数量、总价。

系统以菜单方式工作,实现对物品信息的录入、修改、统计、排序、查询、输出等功能。

2概要设计
2.1系统的功能简介
该系统的主要功能是系统以菜单方式工作,实现对物品信息的录入,修改,统计,排序,查询,输出等功能。

2.2总体程序框图
物品管理系统操作主要流程如下,各个函数分别实现不一样的功能。

2.3各个模块之间的主要关系
该程序的功能主要是实现物品信息的录入,并对物品的相应信息进行进本的增删该的计算。

各个模块之间的关系是相互联系的。

首先,主函数包含了所有的子函数。

主函数是整个程序的核心。

子函数之间也是有联系的,对物品读取,插入删除,检索排序必须是在主函数的情况下进行的。

因此在第一步选择菜单项是非常重要的。

第一步菜单项的选择决定用户所要实现的操作功能。

3设计过程及程序代码
整个系统除了主函数外,另外还有8个函数,实现7人功能:输入功能、输出功能、写入磁盘功能、插入并显示功能、分类查找并显示功能、分类排序并显示功能。

各个函数的详细设计说明分别如下:
3.1定义结构体及宏定义
#include "stdio.h"
#include "string.h"
#define NAME_MAX_LEN 20
#define Prod_MAX_NUM 50
typedef struct {
int num;
char name[NAME_MAX_LEN];
double unitprice;
int amount;
double totalprice;
}prodNode;
typedef struct sequence
{
prodNode data[Prod_MAX_NUM];
int len;
}seq;
seq product;
3.2主函数main()
void main()
{ int menuItemCode=1;
product.len=0;
while (menuItemCode!=0)
{
printf("\n\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("* 0.退出系统*\n"); printf("*********************************\n"); printf("请输入所选项菜单项序号:");
scanf("%d",&menuItemCode);
switch (menuItemCode)
{case 1:inputGoods(); break;
case 2:outputGoods(); break;
case 3:saveGoods(); break;
case 4:insertOneGoods(); break;
case 5:deleteOneGoods(); break;
case 6:sortGoods(); break;
case 7:searchGoods(); break;
case 0:break;
default:printf("输入超出范围!\n"); break; }
}
}
3.3输入物品信息函数
void inputGoods() {
int i,n;
printf("请输入物品个数:\n");
scanf("%d",&n);
if (n<0)
r eturn;
for (i=0;i<n;i++)
{
printf("输入物品的编号:\n");
scanf("%d",&product.data[i].num);
printf("输入物品的名字:\n");
scanf("%s",product.data[i].name);
printf("输入物品的单价:\n");
scanf("%lf",&product.data[i].unitprice);
printf("输入物品的数量:\n");
scanf("%d",&product.data[i].amount);
product.data[i].totalprice=product.data[i].unitprice*prod uct.data[i].amount;
}
product.len=n;
}
3.4输出显示物品函数
void outputGoods() {
int i;
if (product.len==0)
{ printf("\n无数据!\n");
return;
}
printf("\n物品的记录为:\n");
printf("编号\t名字\t单价\t数量\t总价\n");
for (i=0;i<product.len;i++)
{printf("%d\t%s\t%lf\t%d\t%.2lf",product.data[i].num,pro duct.data[i].name,product.data[i].unitprice,product.data[i].a mount,product.data[i].totalprice);
printf("\n");
}
}
3.5将物品写入磁盘
void saveGoods()
{ int i;
FILE *fp;
if (product.len==0)
{ printf("\n无数据!\n");
return;
}
fp=fopen("D:\\goods.txt","w");
if (fp==NULL)
{
printf("文件打开失败!\n");
return;
}
fprintf(fp,"%s\t","编号");
fprintf(fp,"%s\t","名称");
fprintf(fp,"%s\t ","单价");
fprintf(fp,"%s\t","数量");
fprintf(fp,"%s","总价");
for (i=0;i<product.len;i++)
{ fprintf(fp,"\n");
fprintf(fp,"%d\t",product.data[i].num);
fprintf(fp,"%s\t",product.data[i].name); fprintf(fp,"%lf\t",product.data[i].unitprice); fprintf(fp,"%d\t",product.data[i].amount); fprintf(fp,"%.2lf",product.data[i].totalprice); }
fclose(fp);
printf("已成功存盘!\n");
}
3.6插入物品记录函数
void insertOneGoods()
{ prodNode G;
int i,pos;
if(product.len==Prod_MAX_NUM)
{
printf("表已满!\n");
return;
}
printf("请输入插入位置:");
scanf("%d",&pos);
if (pos<0||pos>product.len)
{ printf("插入位置出错!\n");
return;
}
printf("请输入要插入的物品记录:\n");
printf("请输入编号:");
do {
scanf("%d",&G.num);
if (G.num<=0)
printf("输入的编号不合理,请重新输入。

\n"); }while (G.num<=0);
printf("输入物品的名字:\n");
scanf("%s",);
printf("输入物品的单价:\n");
scanf("%lf",&G.unitprice);
printf("输入物品的数量:\n");
scanf("%d",&G.amount);
G.totalprice=G.unitprice*G.amount;
for (i=product.len-1;i>=pos;i--)
product.data[i+1]=product.data[i]; product.data[pos]=G;
product.len=product.len+1;
printf("插入成功!");
}
3.7删除一个物品记录函数
void deleteOneGoods()
{
int i,pos;
if (product.len==0)
{printf("表空!\n");
return;
}
printf("请输入要删除的物品记录的位置:"); scanf("%d",&pos);
if (pos<0||pos>product.len-1)
{
printf("删除的位置出错!\n");
return;
}
for(i=pos+1;i<=product.len-1;i++) product.data[i-1]=product.data[i];
product.len=product.len-1;
printf("删除成功!\n");
}
3.8按照物品编号进行递增排序函数
void bubbleSortByNum()
{ int i,j,n; prodNode temp;
int tag; n=product.len;
for(tag=1,i=0;i<n-1 && tag==1;i++)
{
tag=0;
for (j=n-1;j>i;j--)
if (product.data[j].num<product.data[j-1].num) {
temp=product.data[j];
product.data[j]=product.data[j-1];
product.data[j-1]=temp;
tag=1;
}
}
}
3.9按照物品总价进行递增排序函数
void bubbleSortByTotal()
{ int i,j,n;
prodNode temp;
int tag; n=product.len;
for (tag=1,i=0;i<n-1 && tag==1;i++)
{ tag=0;
for (j=n-1;j>i;j--)
if (product.data[j].totalprice<product.data[j-1].totalprice) { temp=product.data[j];
product.data[j]=product.data[j-1];
product.data[j-1]=temp;
tag=1;
}
}
}
3.10对物品记录进行排序函数
void sortGoods()
{ int subMenuItem=1;
while (subMenuItem!=0)
{
printf("\n\n");
printf("******************排序子菜单
***********************\n");
printf("* 1.按照物品编号进行递增排序*\n");
printf("* 2.按照物品总价进行递增排序*\n");
printf("* 0.退出子菜单
*\n");
printf("********************************************* ******\n");
printf("请输入所选子菜单项序号:");
scanf("%d",&subMenuItem);
switch (subMenuItem)
{
case 1:
bubbleSortByNum();
printf("已按照物品的编号进行递增排序。

排序后的结果为:\n");
outputGoods();
break;
case 2:
bubbleSortByTotal();
printf("已按照物品的总价进行递增排序。

排序后的结果为:\n");
outputGoods();
break;
case 0:break;
default:printf("输入超出范围!\n");
b reak;
}
}
}
3.11输出头部信息函数
void outputHead()
{
printf("编号\t名字\t单价\t数量\t总价\n");
}
3.12输出一条物品信息函数
void outputOneGoods(prodNode s)
{ printf("%d\t%s\t%lf
\t%d\t%.2lf",s.num,,s.unitprice,s.amount,s.totalprice );
printf("\n");
}
3.13判断该编号物品是否存在函数
int isNumberExist (int number)
{ int n,i=0;
n=product.len;
while (i<n && product.data[i].num!=number)
i++;
if (i<n)
return i;
else
return -1;
}
3.14根据物品编号进行查找函数
void seqSearchByNumber (int number)
{ int pos;
pos=isNumberExist(number);
if (pos !=-1)
{ printf("查找成功!查找结果如下:\n");
outputHead();
outputOneGoods(product.data[pos]);
}
else
printf("查找失败!编号为%d的物品不存在。

\n",number);
}
3.15根据物品名字进行查找函数
void seqSearchByName(char name[])
{ int flag=0;
int n,i;
n=product.len;
i=0;
while (i<n)
{
if (strcmp(product.data[i].name,name)==0) {
if (flag==0)
{
flag=1;
printf("查找成功!查找结果如下:\n"); outputHead();
}
outputOneGoods(product.data[i]);
}
i++;
}
if (flag==0)
printf("查找失败!名字为%s的物品不存在。

\n",name); }
3.16对物品记录进行查找函数
void searchGoods()
{ int number;
char name[NAME_MAX_LEN];
int subMenuItem=1;
while (subMenuItem!=0)
{
printf("\n\n");
printf("*********************查找子菜单
********************\n");
printf("* 1.根据物品编号进行查找*\n");
printf("* 2.根据物品名字进行查找*\n");
printf("* 0.退出系统
*\n");
printf("********************************************* ******\n");
printf("请输入所选子菜单项序号:");
scanf("%d",&subMenuItem);
switch (subMenuItem)
{
case 1: printf("请输入要查找的物品编号:");
scanf("%d",&number);
seqSearchByNumber(number);
break;
case 2: printf("请输入要查找的物品名字:");
scanf("%s",name);
seqSearchByName(name);
break;
case 0:break;
default:printf("输入超出范围!\n"); break;
}
}
}
4设计结果与分析
4.1各个模块的程序流程图
1)①主函数程序(N-S)流程图及运行界面主函数程序(N-S)流程图简单说明:该功能主要显示给用户一个进入界面,它
主要的是显示该程序主要能够执行哪些功能。

根据用户输入的不同的菜单项对应不同的功能。

主菜单
2)①输入物品记录信息的(N-S )流程图及程序运行界面 物品记录信息的(N-S )流程
该模块主要是对物品信息进行录入,录入的主要有物品记录的编号、名字、单价、数量等信息然后在存盘。

物品录入信息
物品记录信息存盘
物品记录存盘详细信息
输出物品记录
插入物品记录
插入物品之显示结果
删除物品记录
删除物品记录之显示结果
对物品记录按编号递增排序
对物品记录按总价递增排序
查找子菜单界面
根据物品编号查找
根据物品名字查找
退出系统
源程序如下:
#include "stdio.h"
#include "string.h"
#define NAME_MAX_LEN 20 #define Prod_MAX_NUM 50 typedef struct {
int num;
char name[NAME_MAX_LEN]; double unitprice;
int amount;
double totalprice;
}prodNode;
typedef struct sequence
{
prodNode data[Prod_MAX_NUM];
int len;
}seq;
seq product;
void inputGoods() {
int i,n;
printf("请输入物品个数:\n");
scanf("%d",&n);
if (n<0)
return;
for (i=0;i<n;i++)
{
printf("输入物品的编号:\n");
scanf("%d",&product.data[i].num);
printf("输入物品的名字:\n");
scanf("%s",product.data[i].name);
printf("输入物品的单价:\n");
scanf("%lf",&product.data[i].unitprice);
printf("输入物品的数量:\n");
scanf("%d",&product.data[i].amount);
product.data[i].totalprice=product.data[i].unitprice*product.d ata[i].amount;
}
product.len=n;
}
void outputGoods() {
int i;
if (product.len==0)
{ printf("\n无数据!\n");
return;
}
printf("\n物品的记录为:\n");
printf("编号\t名字\t单价\t数量\t总价\n");
for (i=0;i<product.len;i++)
{printf("%d\t%s\t%lf\t%d\t%.2lf",product.data[i].num,product.d ata[i].name,product.data[i].unitprice,product.data[i].amount,pro duct.data[i].totalprice);
printf("\n");
}
}
void saveGoods()
{ int i;
FILE *fp;
if (product.len==0)
{ printf("\n无数据!\n"); return;
}
fp=fopen("D:\\goods.txt","w");
if (fp==NULL)
{
printf("文件打开失败!\n");
return;
}
fprintf(fp,"%s\t","编号");
fprintf(fp,"%s\t","名称");
fprintf(fp,"%s\t ","单价");
fprintf(fp,"%s\t","数量");
fprintf(fp,"%s","总价");
for (i=0;i<product.len;i++)
{ fprintf(fp,"\n");
fprintf(fp,"%d\t",product.data[i].num); fprintf(fp,"%s\t",product.data[i].name); fprintf(fp,"%lf\t",product.data[i].unitprice); fprintf(fp,"%d\t",product.data[i].amount);
fprintf(fp,"%.2lf",product.data[i].totalprice); }
fclose(fp);
printf("已成功存盘!\n");
}
void insertOneGoods()
{ prodNode G;
int i,pos;
if(product.len==Prod_MAX_NUM)
{
printf("表已满!\n");
return;
}
printf("请输入插入位置:");
scanf("%d",&pos);
if (pos<0||pos>product.len)
{ printf("插入位置出错!\n");
return;
}
printf("请输入要插入的物品记录:\n"); printf("请输入编号:");
do {
scanf("%d",&G.num);
if (G.num<=0)
printf("输入的编号不合理,请重新输入。

\n"); }while (G.num<=0);
printf("输入物品的名字:\n");
scanf("%s",);
printf("输入物品的单价:\n");
scanf("%lf",&G.unitprice);
printf("输入物品的数量:\n");
scanf("%d",&G.amount);
G.totalprice=G.unitprice*G.amount;
for (i=product.len-1;i>=pos;i--)
product.data[i+1]=product.data[i];
product.data[pos]=G;
product.len=product.len+1;
printf("插入成功!");
}
void deleteOneGoods()
{
int i,pos;
if (product.len==0)
{printf("表空!\n");
}
printf("请输入要删除的物品记录的位置:"); scanf("%d",&pos);
if (pos<0||pos>product.len-1)
{
printf("删除的位置出错!\n");
return;
}
for(i=pos+1;i<=product.len-1;i++)
product.data[i-1]=product.data[i];
product.len=product.len-1;
printf("删除成功!\n");
}
void bubbleSortByNum()
{ int i,j,n; prodNode temp;
int tag; n=product.len;
for(tag=1,i=0;i<n-1 && tag==1;i++)
{
tag=0;
for (j=n-1;j>i;j--)
if (product.data[j].num<product.data[j-1].num)
temp=product.data[j];
product.data[j]=product.data[j-1];
product.data[j-1]=temp;
tag=1;
}
}
}
void bubbleSortByTotal()
{ int i,j,n;
prodNode temp;
int tag; n=product.len;
for (tag=1,i=0;i<n-1 && tag==1;i++)
{ tag=0;
for (j=n-1;j>i;j--)
if (product.data[j].totalprice<product.data[j-1].totalprice) { temp=product.data[j];
product.data[j]=product.data[j-1];
product.data[j-1]=temp;
tag=1;
}
}
}
void sortGoods()
{ int subMenuItem=1;
while (subMenuItem!=0)
{
printf("\n\n");
printf("******************排序子菜单***********************\n");
printf("* 1.按照物品编号进行递增排序*\n");
printf("* 2.按照物品总价进行递增排序*\n");
printf("* 0.退出子菜单*\n");
printf("********************************************* ******\n");
printf("请输入所选子菜单项序号:"); scanf("%d",&subMenuItem);
switch (subMenuItem)
{
case 1:
bubbleSortByNum();
printf("已按照物品的编号进行递增排序。

排序后的结果为:\n");
outputGoods();
break;
case 2:
bubbleSortByTotal();
printf("已按照物品的总价进行递增排序。

排序后的结果为:\n");
outputGoods();
break;
case 0:break;
default:printf("输入超出范围!\n");
break;
}
}
}
void outputHead()
{
printf("编号\t名字\t单价\t数量\t总价\n");
}
void outputOneGoods(prodNode s)
{ printf("%d\t%s\t%lf \t%d\t%.2lf",s.num,,s.unitprice,s.amount,s.totalprice); printf("\n");
}
int isNumberExist (int number)
{ int n,i=0;
n=product.len;
while (i<n && product.data[i].num!=number)
i++;
if (i<n)
return i;
else
return -1;
}
void seqSearchByNumber (int number)
{ int pos;
pos=isNumberExist(number);
if (pos !=-1)
{ printf("查找成功!查找结果如下:\n");
outputHead();
outputOneGoods(product.data[pos]);
}
else
printf("查找失败!编号为%d的物品不存在。

\n",number); }
void seqSearchByName(char name[])
{ int flag=0;
int n,i;
n=product.len;
i=0;
while (i<n)
{
if (strcmp(product.data[i].name,name)==0)
{
if (flag==0)
{
flag=1;
printf("查找成功!查找结果如下:\n");
outputHead();
}
outputOneGoods(product.data[i]);
}
i++;
}
if (flag==0)
printf("查找失败!名字为%s的物品不存在。

\n",name);
}
void searchGoods()
{ int number;
char name[NAME_MAX_LEN];
int subMenuItem=1;
while (subMenuItem!=0)
{
printf("\n\n");
printf("*********************查找子菜单********************\n");
printf("* 1.根据物品编号进行查找*\n");
printf("* 2.根据物品名字进行查找*\n");
printf("* 0.退出系统*\n");
printf("********************************************* ******\n");
printf("请输入所选子菜单项序号:"); scanf("%d",&subMenuItem);
switch (subMenuItem)
{
case 1: printf("请输入要查找的物品编号:");
scanf("%d",&number);
seqSearchByNumber(number);
break;
case 2: printf("请输入要查找的物品名字:");
scanf("%s",name);
seqSearchByName(name);
break;
case 0:break;
default:printf("输入超出范围!\n"); break;
}
}
}
void main()
{ int menuItemCode=1;
product.len=0;
while (menuItemCode!=0)
{
printf("\n\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("* 0.退出系统*\n"); printf("*********************************\n"); printf("请输入所选项菜单项序号:");
scanf("%d",&menuItemCode);
switch (menuItemCode)
{case 1:inputGoods(); break;
case 2:outputGoods(); break;
case 3:saveGoods(); break;
case 4:insertOneGoods(); break;
case 5:deleteOneGoods(); break;
case 6:sortGoods(); break;
case 7:searchGoods(); break;
case 0:break;
default:printf("输入超出范围!\n"); break;
}
}
}
5设计心得
当把程序写好并进行调试是,并不是一帆风顺的,总会遇到很多在调试是遇到的错误。

1.首先在定义函数是,不能输入函数。

否则程序会显示错误。

2.前后定义变量要统一。

3.如果要调用添加函数,修改函数,查找函数,统计函数等要在主函数前面进行申明。

否则会显示警告。

4.对背景颜色设置的时候,当你输入的颜色在内存中不存在时,运行程序过后,系统会告诉你相应的颜色符号常数及数值。

5.如果程序在运行的过程中,对于一个循环语句,如果你返回的值始终是真的,那么程序将进入死循环。

6.未注意int,float型数据的数值范围,int型数据的数值范围(-32768~32768)。

对定义物品单价变量时,如果将物品单价定义为float型,将会出现警告。

7.对应该有花括号的复合语句,忘记加花括弧。

8.多调用的函数在调用语句后才定义,而有在调用前为加说明。

物品管理系统对物品的基本操作有助于用户对数据表的监管及应用,在本课程设计的设计过程中,我刚开始感觉到有点头痛。

要通过一学期c语言的学习后将所学知识运用起来有点困难,但回过头来在去看看教科书,对于这些知识点有关的背景,概念和解决方案更进一步的理解,感觉也不是很难。

另外我还体会了从事c语言课程设计工作需要特别谨慎认真的态度和作风,一点都不能马虎。

在这次的课程设计中我遇到了许多问题和麻烦,得到了老师的帮助和同学的帮助,才能使得这次课程设计顺利的进行下去,另外,在程序调试过程中,也得到很多同学的帮助,给我及时指出错误,提出许多宝贵意见。

在此对老师和同学们表示感谢!
由于我的知识浅薄,经验不足及阅历颇浅,在该系统的设计方面还有很多不足,比如功能过少,界面不醒目等问题,我会在以后的学习过程中,根据具体要求不断的修改、完善,争取使系统慢慢趋于完美。

6参考文献
[1]谭浩强著.C语言设计(第二版).北京:清华大学出版社,1999
[2]谭浩强,张基温,唐永炎编著.C语言程序设计,北京:高等教育出版社,1992
[3]谭浩强.C程序设计[M].3版.北京:清华大学出版社,2005。

相关文档
最新文档