您的位置:首页 > 其它

进销存货物管理系统 论文

2017-07-11 10:57 806 查看
 

 

 课程设计(论文)说明书
 

 

 

 

题    目:      进销存货物管理系统    

学    院:      计算机与信息安全学院  

专    业:                    

姓    名:                       

学    号:                   

指导教师:                            

 

 

 

 

 

2017年     5月     12日

 
 

摘  要
 
本课程设计报告系统地阐述了我使用C语言编写的进销存货物管理系统。首先,我对系统进行一个简要的概述。然后,我就系统的需求进行了详细的分析,这是设计工作中不被人们重视但却非常重要的一步。接下来,我把系统中所有的设计简明清晰地展现出来,并把我在设计中遇到的问题和分析解决问题的办法一一做了分析。当然,我还讲到系统中的关键技术和让人眼前一亮的特色。最后,在结论中,我对自己的课程设计做了总体的评价同时简述了我在这次课程设计中的收获和经验。

 
关键词:数据结构与算法课程设计;进销存货物管理系统;C语言

 
目  录

引言...4


系统概述... 5


需求分析... 5

2.1
系统需求... 5

2.2开发环境...8

2.3界面需求...8

2.4
输入输出格式... 8


系统详细设计... 8

3.1 
相关函数... 9

3.1.1
创建链表类... 9

3.1.2
创建存储文件类.. 9

3.1.3读取文件类...9

3.1.4
系统时间类... 10

3.1.5
退出系统... 10

3.2
系统操作模块... 11

3.2.1.
系统提示... 11

3.2.2.添加市场货物信息...11

3.2.3.
删除市场货物信息.. 12

3.2.4.更改系统配置...13

3.3
入库管理模块... 13

3.3.1.
查询市场货物信息.. 13

3.3.2.
查询现有货物信息.. 13

3.3.3.
采购货物... 13

3.3.4.查询进货历史...15

3.3.5.退货...15

3.4
出库管理模块... 15

3.4.1.
查询现有货物信息.. 15

3.4.2.
查询销售历史信息.. 15

3.4.3.销售货物...16

3.5
存储管理模块... 16

3.5.1.
查找货物信息... 16

3.5.2.修改货物信息...17

3.5.3.删除货物信息...17

3.6
统计报表模块... 18

3.6.1.
货物信息统计... 18

3.6.2.
货物信息排序... 18

4
所遇到的问题和分析解决.. 20

5
系统特色及关键技术.. 21

5.1系统特色:...21

5.2关键技术...22

5.2.1.
链表操作:... 22

5.2.2.
文件操作:... 22

5.2.3.时间操作:..23

5.2.4.查找排序统计:..25

6
结论... 26

6.1系统完成情况...26

6.2未能完成的和有待改进之处...26

6.3课程设计期间的收获..27

 

引言

随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。计算机的发明应用,被视为人类的第三次重大的科学技术革命,是一次飞跃。过去的革命最高成就就是“用机器制造机器”,是手的延长,而计算机的出现却能做到“用机器控制机器”,是脑的延伸。计算机是提高生产效率的主要工具及途径。

在信息化快速发展的今天,企业与顾客、企业与供方的关系变得更加密切和复杂。强化管理,规范业务流程,提高透明度,加快商品资金周转,为流通领域信息管理全面网络化打下基础,是商品销售公司乃至众多商业企业梦寐以求的愿望。

随着技术发展,计算机操作及管理日趋简化,计算机知识日趋普及,同时市场经济快速多变,竞争激烈,企业采用计算机管理进货、库存、销售等诸多环节也已成为趋势及必然。进销存管理系统依靠现代化的计算机信息处理技术来管理进货,从而节省了大量的人力、物力,改善了员工的工作条件,减轻了劳动强度,并且能够快速反映出商品的进、销、存等状况和各种反馈信息分析,使管理人员快速对市场的变化做出相应的决策,从而掌握市场先机。

二十一世纪是信息时代,计算机的应用已普及经济和社会生活的各个领域,越来越多的公司、企业、学校等单位都不同程度的利用电脑来进行资源管理。随着电脑应用的普及,单纯人工操作管理方式也即将被淘汰。所以计算机化管理已经成为一种必然的趋势。

本系统运用C语言进行开发,它能够呈现出简明清晰的界面,并被人们能够很好地理解和使用,并能在一些方面给人们更好的服务,相信它能够被大多数用户所接受。在通过运用数据结构与算法相结合的课程设计,来完成进销存货物管理系统时,一方面是为了检查我们的学习成果,另一方面是为了更进一步对数据结构与算法的掌握和运用,同时也让我们清楚的知道自己的掌握水平和不足之处。

 

1  系统概述

在这次课程设计中,我经过近两个星期的努力,上网查找资料并向同学和老师请教过不少问题,克服了种种困难终于完成了进销存货物管理系统。为了做好这次课程设计,我认真做好了需求分析和系统的详细设计。本进销存货物管理系统使用C语言编写,能够完成货物入库、货物删除、货物信息修改、货物信息统计、货物信息查询、货物信息排序、建立货物管理表和文件读写等功能。其中,我使用的数据结构有链表类、时间类,结构体,使用的算法有求和、表插入排序等。

进销存货物管理系统界面简洁、清楚、功能齐全,使用方便,交互界面良好,让没用过这个系统的人一看就知道如何操作。

2 需求分析      

2.1系统需求

在信息技术高速发展的今天,传统的数据统计方式在处理庞大繁杂的信息量时显得力不从心,于是,人们对于运用计算机来辅助和
4000
管理工作的需求正在逐步提高。随着各个仓库中的货物信息的逐步增加,人们要求对仓库货物更加简便的操作,由于管理人员水平有限,导致某些货物纪录管理并不完善,特别是繁杂的货物利润,仓库获利管理纪录,不易查询、修改,极易导致错误,而落后的仓库货物管理方法随着社会的日益竞争,必将被淘汰。 由计算机来管理庞大而繁杂的货物信息纪录是非常合适的,不仅查询和修改方便,并且效率高,速度快,完全能够满足现代化仓库进销存的需要,同时也更利于实现全面办公自动化。因此开发一套仓库进销存管理系统软件势在必行。我在唐麟老师指导下开发了《进销存货物管理系统》。《进销存货物管理系统》旨在为各大企业的仓库管理中提供一个功能全面、使用方便的进销存货物管理系统,以替代传统的手工管理货物进销存纪录,同时利用先进信息技术为用户提供一些更为方便实用的功能。

本系统有6个操作模块:系统操作模块,入库管理操作,出库管理操作,储存管理操作,统计报表操作。而在其中还有其他的操作

 

 

 

系统框架图

 

2.2开发环境

开发语言:C语言

开发环境:win764位操作系统

开发软件:MicrosoftVisual C++ 6.0

 

2.3界面需求

系统界面要具有广泛的实用性,便于移植。界面友好,操作简便。根据软件的使用环境、用户的要求,系统界面应该简单、友好、易于使用、方便查看、简洁明快。而且系统是在Windows环境下的应用软件,软件产品的界面应该与操作系统的界面相切合,产品的主界面应该功能齐全,分类明确,让用户一眼看去就能明白大致的功能。

 

2.4输入输出格式

本系统是一个进销存货物管理系统,采用VC++6.0编译器作为开发环境,输入数据类型主要是char、int、float、double等数据类型,输入内容包括:货物名称、编号、入库价格、入库时间等数据。用户在输入货物数据时不需要保证输入数据格式的正确性,系统会自动检测输入的数据是否正确,输出形式与输入形式类似,根据需要可以选择显示输入的各项内容,还可以选择显示计算好盈利后并排序后的记录,显示内容包括:货物名称、货物编号、入库价格、货物数量、总利润等数据。

 

 

3 系统详细设计

考虑到该系统为进销存货物管理系统,在删除、修改、添加等操作方面有大量操作,所以主要采用单链表的形式来存储数据,便于操作。对于进销存货物管理系统定义货物编号唯一,不可重复,所以系统在输入货物相关信息时,要进行货物编号校验,防止货物编号重复。通过构建不同的结构体来存储相应信息,如市场货物信息、仓库货物信息等存储结构。在进行查找、显示等操作时,可以直接在信息链表上进行相关操作,而对于删除、添加、修改操作。对于系统中数据备份、恢复的操作实现的主要思想是,将数据备份到不同的存储路径下,需要恢复时则将备份数据路径下的文件复制到目标文件目录下。如果再次备份,利用的是将原已备份的数据覆盖的思想。

 

3.1  相关函数

将相关的需求封装成一个个函数,然后进行调用。

 

3.1.1 创建链表类

(1)创建仓库货物空链表:PcargoMessage Createnull1(void)

(2)创建市场货物空链表:PbazaarCargo Createnull2(void)

 

3.1.2 创建存储文件类

(1) 创建新文件:void StorageNull1(char *date)

(2) 判断文件是否存在:void Judge()

(3)重新创建新的文件,数据储存到文件:void WStorage(PcargoMessage head1,PbazaarCargo head2,char *date,intx)

(4)市场数据储存到文件,将数据添加到文件末尾:void AStorage(PcargoMessage head1,PbazaarCargo head2,char *date,intx)

 

3.1.3读取文件类

(1)将文本中仓库数据提取到链表:PcargoMessage Read1(char *date)

(2)将文本中市场数据提取到链表:PbazaarCargo Read2(char *date)

3.1.4 系统时间类

(1)为市场类获取系统年月日:PbazaarCargo Time1(PbazaarCargo head)

(2)为仓库类获取系统年月日; PcargoMessageTime2(PcargoMessage head,int x)

(3)判断是否为闰年;int leapyear(int year)

(4)计算日期差:int diff(PcargoMessage head1,PcargoMessage head2,int x)

3.1.5 退出系统

即通过两次循环输出,进行延时模拟退出系统操作,在输出时利用\b来将输出的数字覆盖,使其不在屏幕上显示。详细代码如下:

void Out()

{

   int i,j;

   system("color 16");

   for(i=5;i>=0;i--)

   {

       for(j=0;j<=7200;j++)

       {

          //intf("\n\n\n\n\n\n\t\b%d",i);

       }

       printf("\n\n\n\n\n\n\t\t%d",i);

       system("cls");   //清屏

   }

   system("cls");   //清屏

   exit(0);

}

 

3.2 系统操作模块

该模块主要是对系统进行操作,并添加市场货物信息与删除市场货物信息

3.2.1. 系统提示

    在登入系统时,会在系统中向用户提示货物在仓库中库存量少于某值时的信息,也会向用户提示货物的保质期期少于某值!

    系统提示:void SystemHint(int thecount1,int thecount2)

在函数中,在外面传入两个变量,用于系统提示仓库中货物库存与保质期的最低值。之后调用Read函数读取存储仓库货物信息到链表中,之后使用循环进行查找比较输出信息。

3.2.2.添加市场货物信息

  市场货物信息的结构存储
struct bazaarCargo
{
   int Number;          //市场货物编号
   char Name[20];       //市场货物名称
   char Unit[20];        //货物单位
   char Type[20];        //货物类型
   float Price;           //市场价格
   float Profit;          //市场利润
   int Year;             //保质期~~年
   int Month;           //保质期~~月
   int Day;             //保质期~~日
   int Count1;          //计数
   int Count2;          //计数
   struct bazaarCargo *link;
};
typedef struct bazaarCargo*PbazaarCargo;
添加市场货物包括:

链表的建立主要是利用尾插法建立,利用for循环来判断输入的货物的个数,所以在输入信息之前还要输入要添加市场货物的个数。在输入信息前先读取指定的文件下的信息到链表中,然后通过输入市场货物的;货物编号、货物名称、货物单价、货物类型、市场价格、市场利润、货物保质期。每次输入完一次数据后都会调用
voidAStorage(PcargoMessagehead1,PbazaarCargo head2,char *date,int x)函数,将信息数据存入文件中;在输入货物编号时会进行货物编号验证,防止货物编号重复,即每次输入货物信息时,会与链表前面已存储的市场货物数据的市场货物编号进行比较,如果不存在相同的市场货物编号再将该市场货物数据存储到链表中,若存在相同的市场货物编号则给出提示“该市场货物已存在”,再重新输入数据。

3.2.3. 删除市场货物信息

void Delete();

  该函数主要功能是,删除市场货物信息,读取相应文件里的数据到链表中,输出链表信息,让用户知道有何数据;之后会让用户选择删除操作,其中有删除一条数据和删除所有的数据。主要实现方法为:首先,先使用户选择要删除的类型;若选择删除一条数据,则利用市场货物编号的唯一性,通过查找市场货物编号的方法找出要删除的市场货物的全部信息,如果查找的市场货物存在且确认删除,则在信息链表中完成该删除操作,并将删除后的信息保存到对应文件中;若选择删除所有的数据,则调用StorageNull1(date2)函数,删除对应文件,重新创建一个对应的文件。

 

3.2.4.更改系统配置

  void RevisionHint()

      该功能主要是更改系统提示的里相关最小值。其中先创建一个空链表,让用户选择要修改的内容,有:库存量、保质期(天)。然后根据选择进行操作,首先先将对应文件下的信息读入链表,然后进行循环使其到达最后一个节点。然后输入变量对节点进行赋值,然后调用AStorage(head1,head,date5,2)函数,将数据存到相应的文件中。

3.3 入库管理模块

3.3.1. 查询市场货物信息

调用Message(sh2,2)将对应的文件文件下的市场货物数据信息打印

3.3.2. 查询现有货物信息

调用Message(sh1,1)将对应的文件文件下的市场货物数据信息打印

3.3.3. 采购货物

仓库货物信息的结构存储

struct cargoMessage

{

   charcargoName[20];       //货物名称

   charcargoSite[20];       //货物地址

   int inYear;               //入库时间~~年

   int inMonth;              //入库时间~~月

   int inDay;                //入库时间~~日

   int cargoNumber;          //货物编号

   int marketCount;          //销售数量

   float inPrice;            //入库价格

   int extantCount;          //现存数量

   float marketPrice;        //销售价格

   float theCount;           //计数

   float theCount1;          //计数

   int outYear;              //销售时间~~年

   int outMonth;             //销售时间~~月

   int outDay;               //销售时间~~日

   float Cost;               //存储成本

   intExpirationYear;       //保质期~~年

   intExpirationMonth;      //保质期~~月

   int ExpirationDay;        //保质期~~日

   struct cargoMessage *next;

};

typedef struct cargoMessage *PcargoMessage;

 

添加市场货物包括:

添加新的货物:链表的建立主要是利用尾插法建立,利用for循环来判断输入的货物的个数,所以在输入信息之前还要输入要添加仓库货物的个数。在输入信息前先读取指定的文件下的信息到链表中,然后通过输入仓库货物的;货物编号、货物名称、进货价、售价、存货成本、货物类型、货物保质期,而进货时间会调用函数来自动来获取系统的时间。每次输入完一次数据后都会调用函数,将信息数据存入文件中;在输入货物编号时会进行货物编号验证,防止货物编号重复,即每次输入货物信息时,会与链表前面已存储的市场货物数据的市场货物编号进行比较,如果不存在相同的市场货物编号再将该市场货物数据存储到链表中,若存在相同的市场货物编号则给出提示“该市场货物已存在”,再重新输入数据。当判断没有问题后,会进行对每种货物的纯利润进行计算,然后将数据存入另一个文件中,用做历史采购信息储存。
添加现有货物的库存:首先将含有仓库货物信息的文件读取到链表中,然后遍历打印,使得用户可以看见信息。然后选择要进购的货物的标号,没有此货物就报错,否则就是对应的节点的现存数增加、计数增加。最后将该节点的信息存储到历史货物信息的文件中

3.3.4.查询进货历史

调用Message(sh2,2)将对应的文件文件下的进货历史数据信息打印,之后会有选择是否删除所有的历史的货物的信息,若选择删除所有的数据,则调用StorageNull1(date2)函数,删除对应文件,重新创建一个对应的文件。

 

3.3.5.退货

void SalesReturn()

   该功能是对仓库的货物进行退货处理。首先先将仓库货物的信息对应的文件的信息读取到链表里并进行打印,让用户进行选择要进行退货的货物的标号。然后对链表进行遍历查找,与链表前面已存储的仓库货物数据的仓库货物编号进行比较,如果不存在相同的仓库货物编号则输出该货物不存在,若存在相同的市场货物编号则进行下一步对库存量的判断,若库存为零,则输出“库存为零”;否则提示输入需要退货数量,之后判断退货数是否超过库存量,若没有超过,则使该节点下的库存量减少并减少成本值。

 

3.4 出库管理模块

3.4.1. 查询现有货物信息

调用Message(sh1,1)将对应的文件文件下的市场货物数据信息打印

3.4.2. 查询销售历史信息

调用Message(sh2,2)将对应的文件文件下的销售历史数据信息打印,之后会有选择是否删除所有的历史的货物的信息,若选择删除所有的数据,则调用StorageNull1(date2)函数,删除对应文件,重新创建一个对应的文件。

3.4.3.销售货物

void MarketSell()

该功能是对仓库的货物进行销售处理。首先先将仓库货物的信息对应的文件的信息读取到链表里并进行打印,让用户进行选择要进行销售的货物的标号。然后对链表进行遍历查找,与链表前面已存储的仓库货物数据的仓库货物编号进行比较,如果不存在相同的仓库货物编号则输出该货物不存在,若存在相同的市场货物编号则进行下一步对库存量的判断,若库存为零,则输出“库存为零”;否则提示输入需要销售数量,之后判断退货数是否超过库存量,若没有超过,则使该节点下的库存量减少、销售数增加并计算销售后的存利润。后将数据信息存入对应的文件中,之后再获取当前系统时间,将销售货物的各项信息存入销售货物历史的文件中。

3.5 存储管理模块

3.5.1. 查找货物信息

(1)按货物名称模糊查找

   此查找为模糊查找,即会将只要包含所输入字段的名称都会查找出来。利用的是检索子串在字符串中首次出现的位置函数strstr(),通过循环比较链表,只要调用strstr()函数不返回NULL,说明该货物名称中含有所输入字段,则就会将该货物信息输出。

 

(2)按货物所在地址模糊查找

   此查找为模糊查找,即会将只要包含所输入字段的地址都会查找出来。利用的是检索子串在字符串中首次出现的位置函数strstr(),通过循环比较链表,只要调用strstr()函数不返回NULL,说明该货物地址中含有所输
ee4b
入字段,则就会将该货物信息输出。

 

(2)按货物库存量查找

  先将仓库货物信息读取到相应的链表中,然后输入少于某值的库存量,经过链表的遍历查找,将符合要求的货物信息输出。

 

(3)按货物销售量查找

  先将仓库货物信息读取到相应的链表中,然后输入少于某值的销售量,经过链表的遍历查找,将符合要求的货物信息输出。

3.5.2.修改货物信息

void messageAmend()

该功能进行修改功能,考虑到修改人员信息时可能只需修改其中一项即可,所以此修改操作提供单个修改功能,即分为1.修改货物标号 2.修改货物地址3.修改货物名称 4.修改售价 5.修改现存数 6.修改已售数,用户通过选择不同的操作编号来进行相应的修改。其中在修改货物编号时,重新输入的货物编号,需要进行是否已存在校验,以确保货物编号的唯一性。当确认完成信息修改后,再将修改过后的货物信息存入到相应的文件中。

 

3.5.3.删除货物信息

Void messageDelete()

该函数主要功能是,删除仓库货物信息,读取相应文件里的数据到链表中,输出链表信息,让用户知道有何数据;之后会让用户选择删除操作,其中有删除一条数据和删除所有的数据。主要实现方法为:首先,先使用户选择要删除的类型;若选择删除一条数据,则利用市场货物编号的唯一性,通过查找市场货物编号的方法找出要删除的仓库货物的全部信息,如果查找的仓库货物存在且确认删除,则在信息链表中完成该删除操作,并将删除后的信息保存到对应文件中;若选择删除所有的数据,则调用StorageNull1(date2)函数,删除对应文件,重新创建一个对应的文件。

 

3.6 统计报表模块

3.6.1. 货物信息统计

void cargoStatis()

  该功能是对仓库货物的信息进行各方面的统计,有一些几个方面:

(1)货物种数

先将仓库货物信息的文件的数据读取到链表中,然后对其循环遍历,当找到一种货物时,计数的变量count就加一,最后输出货物种数。

(2)盈亏数

先将仓库货物信息的文件的数据读取到链表中,然后对其循环遍历,当找到一种货物时,然后调用diff(m,m,2)函数获取进货时间到销售时间的时间差,进行对货物盈亏的计算,然后将每一种货物的盈亏数相加,最后输出货物的总盈亏数。

(3)纯利润

先将仓库货物信息的文件的数据读取到链表中,然后对其循环遍历,当找到一种货物时,计算每件该货物的盈利值,并输出!

 

(4)进销数

先将仓库货物信息的文件的数据读取到链表中,然后对其循环遍历,当找到一种货物时,将count4与count5进行累加,加的分别是进货的数量与销售的数量,最后将count4与count5分别打印输出!

 

3.6.2. 货物信息排序

PcargoMessage Sort(PcargoMessageplist,int x)

  该功能是对仓库货物的信息进行各方面的排序,有一些几个方面:

(1)货物编号排序

 

(2)库存数量排序

 

(3)每件货物盈利排序

 

(4)每样货物总盈亏排序

表插入排序算法,表插入排序时,每插入一个记录,最大比较次数等于表中已排序的记录个数;最小比较次数为1,最大比较次数约为n^2/2。表插入排序时记录移动的次数为1,平均时间复杂度为O(n^2)。每个记录中增加一个next字段,所以辅助空间为O(n)。

 

 

具体代码如下:

PcargoMessagenow,pre,p,q,head;

   float z,y;

   head = plist;

   pre = head->next;

   if(pre == NULL)

       return NULL;

   now = pre->next;

   if(now == NULL)  //为空链表或链表中只有一个节点

       return NULL;

   while(now != NULL)

   {

       q = head;

       p = head->next;

while(p !=now && p->cargoNumber >= now->cargoNumber)  //循环结束找到插入位置

          {

              q = p;

              p = p->next;

}

   else

       {

          printf("输入错误!");

          return NULL;

       }

       if(p == now)   //now应放在原位置

       {

          pre = pre->next;

          now = pre->next;

          continue;

       }

       pre->next = now->next;  //使now记录脱链

       q->next = now;          //将now记录插入链表中

       now->next = p;

       now = pre->next;

   }

}

 

4 所遇到的问题和分析解决

(1)问题:需求分析的不明确

解决:在课程设计指导书的帮助下,自己在做课设的过程中不断明确和修正自己的需求分析,不断添加新功能。

(2)问题:数据结构的选择

解决:经常尝试和修改,考虑到链表在动态修改中的快捷方便性,我建立了一个链表类,并把我建立的货物类的数据储存在链表上。在链表上,我的数据能够方便地进行添加、删除、修改等操作。

(3)问题:如何能在下次登录时使用上次登录时存储在文件里的数据

解决:经过同学的帮助和自己的努力,我掌握了如何对存储在文件里的数据进行使用的办法。创建两个函数,一个存储函数,一个读取函数,在下次登入时调用读取函数就可以将上次存储在文件里面的数据读取到链表里面!

(4)问题:我曾经遇到无论我往文件里面写入多少条记录,但文件中只显示一条的记录的问题

解决:对于这样的逻辑问题,我调试了很多次也找不到问题的原因所在,遇到这样纠结的问题,我只好去请教老师。只见老师使用了断点跟踪调试法,很快就发现了问题的原因所在,原来是我的out();语句竟然写在循环里面,导致我只写入了一次便无法再写入了。从中,我不仅了解到写程序时当局者迷,旁观者清,应该多向他人虚心请教的道理,更懂知道了调试程序的方法。我相信经过我的努力,我调试程序的水平一定会越来越好。

 

 

5 系统特色及关键技术

5.1系统特色:

5.1.1. 合理的输入输出提示以及良好的用户交互界面;在输入时分为添加库存和新货两类,而删除也分为删除全部和删除单个两类,使得人机交互更加人性化。

5.1.2. 函数封装整洁,类的接口和实现方法函数的分离

5.1.3. 合理的异常处理机制,允许用户在排除错误后继续运行程序或者给出适当错误提示。

5.1.4. 当进货,销售后,系统会自动计算每种货物的纯利润和货物的盈利情况,进行对用户的进销的提醒。

5.1.5. 系统具有记录进货历史与销售历史的功能,且在用户在进入系统时对库存量少和保质期快到的货物进行提醒。

 

5.2关键技术

5.2.1. 链表操作:

系统主要利用两个表,一个是市场货物信息表,另一个是仓库货物信息表。将货物的信息都存入货物信息链表然后对货物信息链表进行相关查询、统计、修改、删除等操作。链表我使用的尾插入法进行创建,先使用Createnull()创建两个空的节点。然后在其中一个中添加数据,另一个再连接到上一个,之后创建一个空节点重复之前的操作。

5.2.2. 文件操作:

在系统中,我建立了创建空文本函数StorageNull1()、重新将数据存入文件Store()、数据储存到文件,重新创建新的文件WStorage()、数据添加到文件末尾AStorage()、将文本中的数据读取到链表中Read1()。

其中:

 

(1)StorageNull1()关键代码

FILE * fp;

       fp =fopen(date,"wb");

 

(2)Store()关键代码

       if(head1->next != NULL)    //重新存入文件

              {

                     WStorage(head1->next,head2,date,x);

                     head1 =head1->next;

                     while(head1->next!= NULL)

                     {

                            head1 =head1->next;

                            AStorage(head1,head2,date,x);

                     }

              }

 

(3)WStorage()关键代码

       if(fwrite(head1,sizeof(structcargoMessage),1,fp) != 1)

 

(4)AStorage()关键代码

if(fwrite(head1,sizeof(struct cargoMessage),1,fp) != 1)

 

(5)Read1()关键代码

fp = fopen(date,"r");//以"r"(读)的形式读取文件,!*文件必须存在

       head = Createnull1();//链表头节点

       r = head; //工作指针,建立链表 

       if(fp == NULL)

       {

              //StorageNull1();

              printf("读取错误!\n");

              exit(0);

       }

       while(!feof(fp))

       {

              f = Createnull1();//临时节点,从文件中读取节点 

memset(f,0,sizeof(f));   //将f中当前位置后面的sizeof(f)个字节用 0 替换并返回 f 。

              fread(f,sizeof(structcargoMessage),1,fp);

              if(feof(fp))//读取结束跳出循环

              {

                     r->next =NULL;

                     break;

              }

         r->next = f;

               r = f;

               r->next = NULL;

       }

5.2.3.时间操作:

     对货物的各种相关时间进行操作,先是获取系统时间用于进货和销售时的的时间;之后对两个时间进行操作,用于比较时间差后使用于计算利润成本之类的操作。

其中:

 

(1)Time2()获取系统时间,关键代码:

       time_t tmpcal_ptr;

    struct tm *tmp_ptr = NULL;

    time(&tmpcal_ptr); 

tmp_ptr =localtime(&tmpcal_ptr);

 

       head->inYear=1900+tmp_ptr->tm_year;

       head->inMonth=1+tmp_ptr->tm_mon;

       head->inDay=tmp_ptr->tm_mday;

       return head;

 

(2)leapyear()判断是否为闰年,关键代码:

       if((year%4==0 && year%100!=0) ||year%400==0)

              return 1;

 

(3)diff()计算日期差,关键代码:

struct tm *tmp_ptr= NULL;

    time(&tmpcal_ptr); 

    tmp_ptr = localtime(&tmpcal_ptr);

      

       if(x == 1)

       {

              year2 = 1900+tmp_ptr->tm_year;

              month2 = 1+tmp_ptr->tm_mon;

              day2 = tmp_ptr->tm_mday;

 

              year1 = head1->ExpirationYear;

              month1 =head1->ExpirationMonth;

              day1 = head1->ExpirationDay;

       }

       else if(x == 2)

       {

              year1 = head1->inYear;

              month1 = head1->inMonth;

              day1 = head1->inDay+1;

 

              year2 = head1->outYear;

              month2 = head1->outMonth;

              day2 = head1->outDay;

       }

 

       if(year1 == year2)

       {

              if(month1 == month2)

              {

                     diff = day1 - day2;

              }

              else

              {

                     for(i=month1+1;i<month2; i++)

                     {

                            diff += month[i];

                     }

                     diff += month[month1] -day1 + day2;

                     if(leapyear(year1))

                            if(month1 <=2&& month2 >2)

                                   diff++;

              }

       }

       else

       {

              for(i=year1+1; i<year2; i++)

       {

       if(leapyear(i))

              diff += 366;

       else

              diff += 365;

       }

       for(i=month1+1; i<=12; i++)    //date1距离年末多少天

       {

              diff += month[i];

       }

       diff += month[month1] - day1;

       if(month1 <= 2)

              if(leapyear(year1))

                     diff++;

       for(i=1; i<month2; i++)     //date2距离年初多少天

       {

              diff += month[i];

       }

       diff += day2;

       if(month1 > 2)

              if(leapyear(year2))

              diff++;

       }

5.2.4.查找排序统计:

   对货物信息进行查找排序统计,其中查找用到模糊查找,排序是表排序,而统计是对货物的个项信息进行统计。

其中:

(1)generalfind()查找,关键代码:

if((temp=strstr(head1->cargoName,type))!=NULL)

{

       flag=1;//标志有无

printf("…………);

              }

 

(2)cargoStatis()统计,关键代码:

while(m->next!= NULL)

{

       days = diff(m,m,2);

       m = m->next;

       count4 = count4 + (……….); 

              }

 

(3)Sort()排序,关键代码:

       while(now != NULL)

       {

              q = head;

              p = head->next;

              }

             

              if(p == now)   //now应放在原位置

              {

                     pre = pre->next;

                     now = pre->next;

                     continue;

              }

              pre->next = now->next;  //使now记录脱链

              q->next = now;          //将now记录插入链表中

              now->next = p;

              now = pre->next;

       }

6 结论

6.1系统完成情况

在这些周的时间里,虽然历经重重困难和挫折,但是在我自己的努力和老师同学的帮助下终于完成了进销存货物管理系统的设计。尽管系统在功能和性能上可能还有一些缺陷,但是我已经完成了系统设计的任务和目标,达到了需求分析的基本要求,并且在此要求之上添加了各种其他的功能,成功完成了算法与数据结构课程设计。

6.2未能完成的和有待改进之处

未完成的:将市场货物直接导入到仓库中,实现快速进货;设计快速排序算法对链表进行排序;使用函数模板和类模板实现代码简化和程序复用;

有待改进:能够直接交换链表节点,实现对链表的真正排序;实现用户自定义多条件查询;

6.3课程设计期间的收获

 在完成此次的课程设计的过程中,我跨越了传统方式下的教与学的体制束缚,通过自己的思考和设计,培养了自学能力和动手能力。并且由原先的被动的接受知识转换为主动的寻求知识,这可以说是学习方法上的一个很大的突破。在以往的传统的学习模式下,我们可能会记住很多的书本知识,但是通过课程设计,我们学会了如何将学到的知识转化为自己的东西,学会了怎么更好的处理知识和实践相结题。
通过这次课程设计,我认识到数据结构与算法是计算机科学的基础课程,是我们学习的核心课程。我对数据结构和算法又有了新的认识。数据结构的研究不仅涉及到计算机软件,而且和计算机硬件的研究也有着密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。在研究信息检索时也必须考虑如何组织数据,以便使查找和存取数据元素更为方便。可以认为数据结构是介于数学、计算机硬件和计算机软件三者之间的一个核心内容,是从事计算机科学研究及其应用的人必须掌握的重要内容。

这次的课程设计有效的培养了我们独立思考的能力,提高了我们的动手操作水平。在具体设计中,我们巩固了上学期所学的数据结构与算法的理论知识,进一步提高了自己的编程能力。这也是课程设计的目的所在。通过编程实践,不仅开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力,更充分锻炼了我们的编程能力。

在这次课程设计中我也知道了自己的动手能力不强,有待于进一步提高,但在老师和同学的帮助下,我坚持到了最后。我在这次课程设计中学到很多,我会更加自信的走下去。

在课程设计中我体会到:一个好的程序应该是一个高内聚低耦合的程序。而要做出一个好的程序则应该通过对算法与其数据结构的时间复杂度和空间复杂度进行实现与改进。然而,实际上很难做到十全十美,原因是各要求有时相互制约,要节约算法的执行时间往往要以牺牲更多的存储空间为代价:而为了节省存储空间又可能要以更多的时间为代价。因此,只能根据具体情况有所侧重:如果程序的使用次数较少,则应该力求算法简单易懂;如果程序反复多次使用,则应该尽可能选用快速算法或者设置为内联函数;如果解决问题的数据量极大,但是机器的内存空间不是很充足,则在编写算法时应该考虑如何节省空间。

学习了《数据结构与算法》这门课,我们在编写程序时就应该注意到所编写程序的时间复杂度和空间复杂度,以及是否运用了良好的算法,而不是只是象以前编写程序时单纯使用C++的知识。我们要充分考虑程序的性能,从而编写出更好的程序。

在设计报告的写作过程中我也学到了做任何事情都要有的心态,首先我明白了做学问要一丝不苟,对于出现的任何问题都不要轻视,要通过正确的途径去解决,在做事情的过程中要有耐心和毅力,不要一遇到困难就打退堂鼓,只要坚持下去就可以找到思路去解决问题的,在遇到问题时,有必要向老师和同学请教,合作沟通的意义是巨大的。
在这次课程设计中,我认识到了自己的不足之处同时我也收获了很多知识和经验,在今后的学习中,我一定勤于思考,并灵活运用所学知识,多进行编程实践。在总结反思和编程训练中,不断提升自己的编程能力。相信在我的努力下,我的程序设计水平一定会不断提高。

 

 

 

 

参考文献

C程序设计(第四版) 谭浩强著 清华大学出版社

算法与数据结构——C语言描述(第3版)张乃孝等编著

C语言程序设计现代方法 第2版 人民邮电出版社

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: