武汉科技大学城市学院课程设计报告课程名称数据结构课程设计题目商店存货管理系统学部信息工程学部专业计算机科学与技术班级计科二班姓名威指导教师林晓丽2015 年 6 月28 日目录1.1课程设计目的 (3)1.2 课程设计容和要求 (3)1.2.2 要求: (3)1.2.3 运行环境 (4)1.3课程设计分析 (4)1.4 算法描述 (4)1.5 源代码 (7)1.6运行结果分析 (22)小结 .......................................................... 错误!未定义书签。
参考文献....................................................... 错误!未定义书签。
课程设计评分表............................................. 错误!未定义书签。
1.1课程设计目的通过实习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作法,为进一步的应用开发打好基础。
通过实习巩固并提高实习者的C语言知识,并初步了解Visual C++的知识,提高其编程能力与专业水平。
1.2 课程设计容和要求1.2.1 课程设计容建立一商店存货管理系统,要求每次出货时取进货时间最早且最接近保质期中止时间的货物。
分步实施:1.初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2.完成最低要求:建立一个文件,包括5个种类的货物情况,能对商品信息进行扩充(追加),修改和删除以及简单的排序;3.进一步要求:扩充商品数量,以及完成系统查询功能。
有兴趣的同学可以自己扩充系统功能。
1.2.2 要求:1.界面友好,函数功能要划分好2.总体设计应画一流程图3.程序要加必要的注释4.要提供程序测试案5.程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
1.2.3 运行环境该程序的运行环境为Windows xp系统,Microsoft Visual C++6.0版本。
1.3课程设计分析1)需要定义一个结构体数组,其中name表示商品的名称,time表示商品的进货时间,year表示商品的生产日期,no表示商品的保质期。
2)利用冒泡法,对商品进行排序。
3)选择需要的功能,其中功能包括商品的最原始添加,商品的插入,删除,查找,将数据写入文件中,从文件中读出数据等操作。
4)选择输入0~9,10个数的其中一个数,进行相应的操作。
5)进行完所的操作之后,选择保存功能,将数据保存到文件中。
6)退出程序。
1.4 算法描述1)先定义一个商品的结构体数组:typedef struct /*定义结构体数组*/{char name[20];/*商品名称*/int time;/*进货时间*/int year;/*生产日期*/int no;/*保质期*/}goods;2)建立一个菜单函数,显示10个功能,供用户选择,进行人机对话。
3)设置一个排序的函数,int shuru(shangp gs[],int n)。
利用冒泡法先对商品按进货的时间排序,对进货时间一样的货物,再按离保质期最近排序。
4)设置一个输入的函数,int Input(goods gs[],int n)。
这个函数是最初商品输入函数,当选择了这个功能后,如果是第一次运行这个程序,保存输入,那将在D盘产生一个名为“商品.doc”的文件,如果已经运行过了,并保存输入,那输入的商品信息将代替原有的信息,数据输入使用交互输入,进行人机对话,确定是否进行下一个数据的添加。
并且调用了上面的排序函数,对输入的数据进行排序。
5)设置一个显示的函数,void shuchu(goods gs[],int n)。
显示上面输入的所有数据,或者是从文件中读取的数据。
6)设置一个插入的函数,int charu(goods gs[],int n)。
每次插入一组数据,如果要再插入,则再选择这个功能进行操作。
并且在插入的同时,已经排好序,把数据插入适合的位置。
7)设置一个查找删除的函数,intchazhaoxianshi((goods gs[],int n)。
输入要查找的商品名称,如果不存在,则输出失败信息,如果存在,则用下一个信息代替原有信息的位置。
8)设置一个查找显示的函数void chazhaoxianshi(goods gs[],int n)。
输入要查找的商品名称,如果不存在,则输出失败信息,如果存在,则显示信息。
9)设置一个写入文件的函数,void xiewenjian(goods gs[],int n)。
设置文件指针,先判断文件是否能打开并且能进行写操作,不能则输出失败信息,能则循环写入数据,写完关闭文件。
10)设置一个读文件的函数,int duwenjian(goods gs[],int n)。
设置文件指针,判断文件是否能打开而且能进行读操作,能则先读出总的数据量,接着循环读出数据,最后关闭文件。
11)进入最后一步,main函数。
判断选择的操作,根据用户选择的操作,利用switch语句进行相应的函数调用。
12)选择保存功能,对数据进行保存,然后选择结束程序退出功能,退出程序。
paixu (gs,n)初始条件:数据已经存在操作结果:数据进行排序shuru(gs, n)初始条件:没有任数据存在,或者要替换原文件中的所有数据操作结果:数据进行输入shuchugs,n)初始条件:数据已经存在操作结果:数据显示charu(gs,n)初始条件:数据已经存在操作结果:数据插入chanchu(gs,n)初始条件:数据已经存在操作结果:数据删除chazhaoshanchu i(gs,n)初始条件:数据已经存在操作结果:数据统计xiewenjian (gs,n)初始条件:数据已经存在操作结果:写入文件中duwenjian (gs,n)初始条件:文件已经存在操作结果:从文件中读出1.4流程图:1.5 源代码#include<stdio.h> /*引用库函数*/ #include<stdlib.h>#include<ctype.h>#include<string.h>typedef struct /*定义结构体数组*/char name[20];/*商品名称*/int time;/*进货时间*/int year;/*生产日期*/int no;/*保质期*/}goods;goods gs[80]; /*结构体数组变量*/int menu_select() /*菜单函数*/{char c;do{system("cls"); /*运行前清屏*/printf("\t\t**** 商品系统****\n"); /*菜单选择*/printf("\t\t | 1. 输入数据|\n");printf("\t\t | 2. 显示数据|\n");printf("\t\t | 3. 插入数据|\n");printf("\t\t | 4. 删除数据|\n");printf("\t\t | 5. 查找数据|\n");printf("\t\t | 6. 统计并显示进货时间最早且最接近保质期中止时间的货物|\n");printf("\t\t | 7. 写入文件|\n");printf("\t\t | 8. 读文件|\n");printf("\t\t | 9. 对读入的文件进行排序|\n");printf("\t\t | 0. 退出|\n");printf("\t\t*****************************************\n");printf("\t\t\t请选择(0-9):");c=getchar(); /*读入选择*/}while(c<'0'||c>'9');return(c-'0'); /*返回选择*/}void Sort_by_time(goods gs[],int n) /*按进货时间排序*/{int i,j,*a,*b,c,*p,*q,s,*m,*k,d,e,f;char t[10];for(i=0;i<n-1;i++) /*冒泡法排序*/for(j=0;j<n-1-i;j++)if(gs[j].time>gs[j+1].time){a=&gs[j+1].time;b=&gs[j].time;c=*a;*a=*b;*b=c;strcpy(t,gs[j+1].name);strcpy(gs[j+1].name,gs[j].name);strcpy(gs[j].name,t);p=&gs[j+1].year;q=&gs[j].year;s=*p;*p=*q;*q=s;m=&gs[j+1].no;k=&gs[j].no;d=*m;*m=*k;*k=d;}else if(gs[j].time==gs[j+1].time){p=&gs[j].year;a=&gs[j+1].year;b=&gs[j].no;q=&gs[j+1].no;e=(*p)+(*b)*10000;f=(*a)+(*q)*10000;if(e>f){a=&gs[j+1].time;b=&gs[j].time;c=*a;*a=*b;*b=c;strcpy(t,gs[j+1].name);strcpy(gs[j+1].name,gs[j].name);strcpy(gs[j].name,t);p=&gs[j+1].year;q=&gs[j].year;s=*p;*p=*q;*q=s;m=&gs[j+1].no;k=&gs[j].no;d=*m;*m=*k;*k=d;}}int Input(goods gs[],int n) /*输入若干条记录*/ {int i=0;char sign,x[10];while(sign!='n'&&sign!='N') /*判断*/{printf("\t\t\t商品名称:"); /*交互输入*/scanf("\t\t\t%s",gs[n+i].name);printf("\t\t\t进货时间(例20070201):");scanf("\t\t\t%d",&gs[n+i].time);printf("\t\t\t生产日期(例20070201):");scanf("\t\t\t%d",&gs[n+i].year);printf("\t\t\t保质期(年):");scanf("\t\t\t%d",&gs[n+i].no);gets(x); /*清除多余的输入*/printf("\t\t\t继续输入?(Y/N)");scanf("\t\t\t%c",&sign); /*输入判断*/i++;}Sort_by_time(gs,n+i); /*调用排序函数*/ return(n+i);void Display(goods gs[],int n) /*显示所有记录*/{int i;printf("\t\t------------------------------------------------\n"); /*格式头*/printf("\t\t商品名称进货时间生产日期保质期(年)\n"); printf("\t\t------------------------------------------------\n");for(i=1;i<n+1;i++) /*循环输入*/{printf("\t\t%-5s %d %d %d\n",gs[i-1].name,gs[i-1].time, gs[i-1].year,gs[i-1].no);if(i>1&&i%10==0) /*每十个暂停*/{printf("\t\t\t-----------------------------------\n"); /*格式*/printf("\t\t\t");system("pause");printf("\t\t\t-----------------------------------\n");}}printf("\t\t\t");system("pause"); /*按任键继续*/}int Insert_a_record(goods gs[],int n) /*插入一条记录*/{char x[10]; /*清除多余输入所用*/printf("\t\t\t商品名称:"); /*交互输入*/scanf("\t\t\t%s",gs[n].name);printf("\t\t\t进货时间:");scanf("\t\t\t%d",&gs[n].time);printf("\t\t\t生产日期:");scanf("\t\t\t%d",&gs[n].year);printf("\t\t\t保质期:");scanf("\t\t\t%d",&gs[n].no);gets(x);n++;Sort_by_time(gs,n); /*调用排序函数*/printf("\t\t\t插入成功!\n"); /*返回成功信息*/return(n);}int Delete_a_record(goods gs[],int n) /*按商品名字查找,删除一条记录*/ {int i=0,j;printf("\t\t\t商品名称:");scanf("%s",s);while(strcmp(gs[i].name,s)!=0&&i<n) i++; /*查找判断*/if(i==n){printf("\t\t\t没找到!\n"); /*返回失败信息*/return(n);}for(j=i;j<n-1;j++) /*删除操作*/{strcpy(gs[j].name,gs[j+1].name);gs[j].time=gs[j+1].time;gs[j].year=gs[j+1].year;gs[j].no=gs[j+1].no;}printf("\t\t\t删除成功!\n"); /*返回成功信息*/return(n-1);}void Query_a_record(goods gs[],int n) /*查找并显示一个记录*/ {int i=0;printf("\t\t\t输入要查找的商品名称:");scanf("\t\t\t%s",s);while(strcmp(gs[i].name,s)!=0&&i<n) i++; /*查找判断*/if(i==n){printf("\t\t\t没找到!\n"); /*输入失败信息*/return;}printf("\t\t\t进贷时间:%d\n",gs[i].time); /*输出该商品信息*/ printf("\t\t\t生产日期:%d\n",gs[i].year);printf("\t\t\t保质期:%d\n",gs[i].no);}void WritetoText(goods gs[],int n) /*将所有记录写入文件*/ {int i=0;FILE *fp; /*定义文件指针*/if((fp=fopen("d:\\商品.doc","wb"))==NULL) /*打开文件*/ {printf("\t\t\tcann't open the file\n");return;}fprintf(fp,"%d\n",n); /*循环写入数据*/while(i<n){fprintf(fp,"%-5s%d %d %d\n",gs[i].name,gs[i].time,gs[i].year,gs[i].no);i++;}fclose(fp); /*关闭文件*/printf("\t\t\tSuccessed!\n"); /*返回成功信息*/}int AddfromText(goods gs[],int n) /*从文件中读入数据*/{int i=0,num;FILE *fp; /*定义文件指针*/if((fp=fopen("d:\\商品.doc","rb"))==NULL) /*打开文件*/{printf("\t\t\tcann't open the file\n"); /*打开失败信息*/printf("\t\t\t");return(n);}fscanf(fp,"%d",&num); /*读入总记录量*/while(i<num) /*循环读入数据*/{fscanf(fp,"%s%d%d%d",gs[n+i].name,&gs[n+i].time,&gs[n+i].year,&gs[n+i].no );i++;}n+=num;fclose(fp); /*关闭文件*/printf("\t\t\tSuccessed!\n");printf("\t\t\t");system("pause");return(n);}void main() /*主函数*/{int n=0;for(;;){switch(menu_select()) /*选择判断*/{case 1:printf("\t\t\t输入最初商品\n"); /*输入若干条记录*/n=Input(gs,n);break;case 2:printf("\t\t\t显示所有商品\n"); /*显示所有记录*/Display(gs,n);break;case 3:printf("\t\t\t插入\n");n=Insert_a_record(gs,n); /*插入*/printf("\t\t\t");system("pause");break;case 4:printf("\t\t\t删除\n");n=Delete_a_record(gs,n); /*按商品名称查找,删除*/printf("\t\t\t");system("pause");break;case 5:printf("\t\t\t查找并显示\n");Query_a_record(gs,n); /*查找并显示*/printf("\t\t\t");system("pause");break;case 6:printf("\t\t\t统计并显示进货时间最早且最接近保质期中止时间的货物\n");printf("\t\t\t共有%d 件商品.\n",n); /*总共记录数*/printf("\t\t\t进货时间最早且最接近保质期中止时间的货物:\n");printf("\t\t\t商品名称r:%s\n",gs[0].name);printf("\t\t\t进货时间:%d\n",gs[0].time);printf("\t\t\t生产日期:%d\n",gs[0].year);printf("\t\t\t保质期:%d\n\n",gs[0].no);printf("\t\t\t");system("pause");break;case 7:printf("\t\t\t写到文件中\n"); WritetoText(gs,n); /*循环写入数据*/ printf("\t\t\t");system("pause");break;case 8:printf("\t\t\t文件中读数据\n");n=AddfromText(gs,n);printf("\t\t\t");/*文件中读数据*/break;case 9:printf("\t\t\t\n");Sort_by_time(gs,n);printf("\t\t\t");/*对读入的文件进行排序*/ break;case 0:printf("\t\t\t结束退出!\n"); /*结束程序*/printf("\t\t\t");system("pause");exit(0);}}}1.6运行结果分析1.初始界面:(从D盘读入已准备好的文件数据)2.选择功能8并选择功能2,显示最初的数据:3.对读出的文件进行排序,选功能9,再选功能2,进行显示:4.选择功能3,进行插入操作,选择功能2,进行显示:5.选择功能4,进行删除操作,第一种情况为找不到要删除的商品数据:接下去这个是另一种情况,即找到要删除的商品数据并按功能2,显示:6.选择功能5,第一种情况为找不到要查找的数据:第二种为存在情况7.选择功能6:8.选择功能7:9.选择功能0,退出程序。