《基于c、c语言的客户消费积分管理系统的设计与实现精品资料.doc》由会员分享,可在线阅读,更多相关《基于c、c语言的客户消费积分管理系统的设计与实现精品资料.doc(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、西安建筑科技大学毕业设计(论文)毕业设计(论文)目录1.设计目的12. 问题描述23.需求分析23.1 数据需求23.2 基本功能需求23.3 非功能性需求24.概要设计34.1 数据结构34.2 系统包含的函数34.3 函数间的关系34.4 系统功能模块图45.详细设计45.1 结构体的详细定义45.2 系统函数详细介绍55.3 系统功能模块介绍115.4 具体模块设计126.调试分析147.使用说明158. 设计总结199.参考文献20数据结构毕业设计客户消费积分管理1.设计目的“数据结构”是计算机科学与技术专业一门十分重要的专业技术基础课,计算机科学各领域及有关的应用软件都要使用到各种数
2、据结构。对于从事计算机科学及其应用的科技工作者来说,数据结构与算法是必须透彻地掌握的重要基础。学习数据结构与算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。毕业设计是加强学生实践能力的一个强有力手段。毕业设计所安排的题目,在难度和深度方面都大于平时的上机训练,要求同学在完成设计和编写中小型软件的过程中,深化对数据结构与算法毕业中基本概念、理论和方法的理解;训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念;使同学的程序设计与调试水平有一个明显的提高。毕业设计要求学生在完成程序设计的同时能够撰写比较规范的设计报告。严格实施毕业设计这一环节,对于学生基本程序设计
3、素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。2. 问题描述 本设计用于管理客户的消费情况,从而根据客户的消费积分对客户实行不同程度的打折优惠。客户消费积分管理系统具体应该使用一定的存储结构将用户的消费信息存储起来,以方便管理。其中用户的信息包括用户姓名,用户身份证号码,用户消费金额,用户积分多少。继而完成对于客户信息的增删查改等管理。3.需求分析3.1 数据需求 应使用结构体对每个用户的信息进行封装。其中用户的信息包括用户姓名,用户身份证号码,用户消费金额,用户积分多少。然后运用链表的存储结构将所有用户信息进行保存。继而完成各种功能。3.2 基本功能需求 本设计应该同时完成以下
4、功能添加用户查找用户修改用户删除用户统计客户数量按一定顺序显示客户信息清空用户信息用一定的存储方法实现用户信息的永久保存,充分满足对于管理系统的要求。3.3 非功能性需求用户界面需求:简洁、易用、易懂、友好的用户界面。硬件要求:装有Visual C+6.0的计算机。可靠性需求:保证用户在正常使用本系统时,用户的操作或误操作不会产生数据的丢失。4.概要设计4.1 数据结构 本设计采用链表的存储方式对用户的信息进行临时性的存储,其中每个节点的信息用结构体进行封装,其中用户的信息包括用户姓名,用户身份证号码,用户消费金额,用户积分数量。4.2 系统包含的函数系统包含的函数有:添加函数,按姓名查找函数
5、,按身份证号查找函数,修改函数,删除函数,显示函数,统计函数,排序函数,计算折扣函数,清空函数,文件保存函数,文件读取函数,身份证验证函数和主函数。共计14个函数。4.3 函数间的关系显示函数调用计算折扣函数,计算出客户的折扣信息,并在屏幕上显示;主函数在调用添加,修改,删除,清空函数之后都必须调用文件保存函数进行保存。调用显示函数之前先调用排序函数,以便屏幕输出有序的用户信息。调用添加函数之前先调用身份验证函数,判断身份证号是否重复。其它各个函数都各自独立。4.4 系统功能模块图图 4-1 系统功能模块图注释:此处的调用不是真正意义上的调用,而是在主函数中调用A函数前,先调用B函数。以此来类
6、比A函数调用B函数。5.详细设计5.1 结构体的详细定义 构造一个结构体,封装客户的个人信息,作为链表中每个节点的模板。括用户姓名,用户身份证号码,用户消费金额,用户积分数量。具体实现如下:struct C /定义一个结构体 C char name20; char ID20; double consume; double integer; C *next; ;5.2 系统函数详细介绍添加用户。函数void Getelem (cnode *head);采用类将每个用户的信息封装,其中包括用户姓名name、用户省份证号ID、用户消费金额consume、积分integer的信息。输入一个客户信息后再
7、开辟新的节点连接。如添加一个客户:定义指针p,用于申请空的结点空间,p=(cnode*)malloc(sizeof(cnode),利用函数输入姓名,身份证号,并保证身份证号的正确。void A:Getelem (C *head) /增加客户 C *p; double y;p=(C*)malloc(sizeof(C); /申请空的节点空间coutp-name;coutp-ID;while(strlen(p-ID)!=18)cout p-ID;coutp-consume;p-integer=p-consume;y=display_discount(p-integer); /调用函数计算折扣cout
8、折扣:ynext=head-next;head-next=p;void Search(cnode *head,char ID);和void Search(cnode *head,char ID);查找用户,用每一个节点的ID信息或者姓名信息和待查信息进行比对,直到找到正确信息并显示。用身份证号(ID)核对的程序实现如下:void A: Searchi(C *head,char ID) /查找用户C *p;double y;p=head;if(p-next=NULL)coutnext!=NULL)p=p-next;if(strcmp(ID,p-ID)=0) /判断身份证号是否相同 cout *e
9、ndl;cout姓名:nameendl;cout身份证号:IDendl;cout消费:consumeendl;cout积分:integerinteger);cout折扣:y折endl;cout *next=NULL)coutnext!=NULL)p=p-next;if(strcmp(ID,p-ID)=0) /判断身份证号是否相同 cout *endl;cout姓名:nameendl;cout身份证号:IDendl;cout消费:consumeendl;cout积分:integerinteger);cout折扣:y折endl;cout *endl;coutchoose;if(choose=1)c
10、outp-name;void Delete(cnode *head,char ID);查找显示并删除。查找时的做法与上述两个函数基本相同,以下程序用来实现删除该客户(该节点)的功能。coutx;if(x=1)head-next=p-next;cout删除成功!;elsecoutnext!=NULL)cout *next;cout姓名:nameendl;cout身份证号:IDendl;cout消费:consumeendl;cout积分:integerinteger);cout折扣:y折next!=NULL)p=p-next;i+;void A: Clear(C *head);清空所有客户信息。代
11、码实现如下:void A: Clear(C *head)C *p;p=head; while(p-next!=NULL)head=p;p=p-next; head-next=p-next; cout清空成功!;double display_discount(double integer);计算客户折扣,每次显示用户信息调用一次保证客户为最新打折信息。根据每个客户的积分不同,用if和else语句打印出不同的折扣信息。详见附录。void paixu(C *head);排序函数,用冒泡排序法将用户信息按照积分从小到大的顺序排列。在显示用户信息的时候调用。代码详见附录。void save(C*head
12、);和void load(C*head);将用户信息从链表中写入文件中,并可以从文件中读入链表。代码如下:void A:save(C*head) ofstream outstuf ; outstuf.open(chesen.txt,ios:out ) ; if(!outstuf) coutFile could not be open.endl ; cout保存失败!next; while(save!=NULL) outstufname ID consume integernext ; cout保存成功,保存文件为:abcd)C *p=new C(a,b,c,d,NULL); p-next=he
13、ad-next; head-next=p; if(head=NULL) cout加载失败,请检查格式是否正确或文件是否有效!; else cout加载成功!;11 int check(C*head,char ID);身份验证函数。判断身份证号是否重复。5.3 系统功能模块介绍添加用户模块。函数void Getelem (cnode *head);采用类将每个用户的信息封装,其中包括用户姓名name、用户省份证号ID、用户消费金额consume、积分integer的信息。输入一个客户信息后再开辟新的节点连接。如添加一个客户:定义指针p,用于申请空的结点空间,p=(cnode*)malloc(si
14、zeof(cnode),利用函数输入姓名,身份证号,并保证身份证号的正确。查找模块void Search(cnode *head,char ID);和void Search(cnode *head,char ID);查找用户,用每一个节点的ID信息或者姓名信息和待查信息进行比对,直到找到正确信息并显示。修改模块void Amend(cnode *head,char ID);查找并显示然后修改。先判断链表是否为空,若为空则提示没有客户;若不为空,则用每一个节点信息和待查节点信息进行比对,知道找到该节点,然后对该节点信息进行修改。删除模块void Delete(cnode *head,char I
15、D);查找显示并删除。查找时的做法与上述两个函数基本相同,以下程序用来实现删除该客户(该节点)的功能。cout你确认删除?1、确定。2、取消。请选择:;显示模块void Showall(cnode *head);遍历链表并显示客户。用一个while语句实现打印每一个用户。统计模块void count(cnode *head);遍历统计客户数量显示。用一个计数变量i遍历链表实现计数功能。清空模块void A: Clear(C *head);清空所有客户信息。计算折扣模块double display_discount(double integer);计算客户折扣,每次显示用户信息调用一次保证客户为
16、最新打折信息。根据每个客户的积分不同,用if和else语句打印出不同的折扣信息。排序模块void paixu(C *head);排序函数,用冒泡排序法将用户信息按照积分从小到大的顺序排列。在显示用户信息的时候调用。文件读取模块void save(C*head);和void load(C*head);将用户信息从链表中写入文件中,并可以从文件中读入链表。11 int check(C*head,char ID);身份验证函数。判断身份证号是否重复。5.4 具体模块设计添加模块流程流程图 图5-1 添加模块流程流程图查找函数模块流程图 图5-2 查找函数模块流程图统计函数模块流程图 图5-3 统计函
17、数模块流程图计算折扣函数 图5-4 计算折扣函数文件保存模块 图5-5 文件保存模块流程图文件读取函数 图5-6 文件读取函数流程图修改函数,删除函数,显示函数,清空函数,查找函数基本相同,这里不在赘述。6.调试分析本软件是基于Windows的编程开发,所以,软件调试必须在Windows环境下进行。调试前须做好准备工作:(1) 需要安装Visual C+6.0的计算机一台;配置好之后,在Visual C+6.0环境下进行软件的调试。(2) 测试数据:客户信息输入:在“输入数据”模块中,根据主界面提示,键入数字1,确定,再按提示进行操作测试,添加一条记录后,发现在数据文本中有保存该记录,如果错误
18、输入,观察是否能正常提示信息。否则修改程序再进行调试。客户信息的查询:按姓名进行查询、按ID进行查询、这两个功能模块在具体编程实现上基本上是一样的,因为都是针对学生信息的查询。因此我们仅以“按姓名进行查询”为例来说明一下这两个功能模块的详细实现过程。另一个个模块仅介绍其实现思想。(3) 算法改进设想:在程序设计前期,我们并没有用txt文件来保存学生信息。经过我不断的修改以及调试后,该程序总算可以进行txt文本的读出与写入,并且添加学生信息后可以直接将信息保存在txt文本文件中。7.使用说明主函数界面图7-1 主界面图增加客户 图7-2 增加客户查找客户图7-3 查找客户示意图修改客户图7-4
19、修改客户示意图删除客户图7-5 删除客户示意图显示客户图7-6 显示客户示意图统计客户图7-7 统计客户示意图清空客户图7-8 清空客户示意图加载客户信息 图7-9 加载客户信息示意图8. 设计总结这次毕业设计在我和同学们以及老师的努力下顺利完成了。这是第二次独自完成的毕业设计,虽然有了上次的经验,但难度还是很大。不过在此同时我也学到了很多宝贵的东西,相信对我以后的学习会有很大的启发。首先,我深刻地认识到了一个好的管理系统在生活中所发挥的作用是巨大的,能够大大降低劳动力成本,提高工作效率。因此,开发一个好的管理系统对程序员的要求也是很大的。开发系统之前一定要详细了解客户的需求,并尽可能优化客户
20、需求。开发过程中,一定要注意程序的运行效率,以及人机交互界面的友好,这些都是非常重要的。在程序设计前期,我们并没有用txt文件来保存学生信息。经过我不断的修改以及调试后,该程序总算可以进行txt文本的读出与写入,并且添加学生信息后可以直接将信息保存在txt文本文件中。从此,自己又可以掌握了文件存储的知识要点。开始的时候,客户信息的存储时混乱的,没有顺序和规律的。最后下决心运用链表排序的方法对客户信息进行一定标准的排序,并且获得成功。弥补了当时学习链表的时候的一大短板。并且复习巩固了与之相关的知识。在开始遇到问题的时候,只是机械地一遍一遍地读程序,期待发现程序的错误,但是没有取得很好的效果。最后
21、我采用了加断点调试等多种方法才解决了悬而未决的一些问题。使我的调试能力有了大大地提高。这次设计虽然顺利地完成了任务,但是还有很多不足。最主要的缺点就是界面问题,界面太过单调,也不够友好。因为一开始担心工作量太过庞大,没有用MFC制作windows界面的想法。所以选择了相对比较低级的DOS界面。在完成设定的任务之后,我曾尝试改版成windows界面。但由于时间仓促,并没有完成预期结果。但也学到了很多关于MFC的知识,相信以后一定会取得成功。一个好的数据存储方式可以大大降低程序员的工作量,也可以解放使用者的劳动力。所以,数据结构可谓是所有程序员应该掌握的重要财富。只要学好数据库,并且在以后的实践中
22、敢于尝试,我相信,一定会创作出满意的东西。9.参考文献1 Clifford,A.Shaffer编著,数决结构与算法分析(C+版),电子工业出版社,2005.7 2 赵文静,祁飞等编著,数据结构与算法,科学出版社,2005.083 赵文静编著,数据结构-C+语言描述,西安交通大学出版社,1999.014 孙鑫,于安萍编著,VC+深入详解,电子工业出版社,2007.75 COHOON & DAVIDSON编著,C+程序设计,清华大学出版社,2005.8各位同学: 大家好! 现将存在的共性问题描述如下,大家以此为标准进行撰写修改: 1.报告文件的命名统一命名成“学号-姓名-题目.doc,方便我归档整
23、理; 2.封面,页眉,页脚都调整好了,按照这个模板把你设计的内容一部分一部分填写进去,具体要求注意的问题已在模板中进行了批注; 3.论文中出现图的地方应该在图下方有标记,例如如果在“概要设计”部分有一个系统流程图,就在图的正下方居中写上“图4-1 系统流程图”,其他的地方依次类推。 图的大小应该跟页面大小一致,太大的缩小一些,居中,“图号 图名”也要居中。 4.有表的地方在表格上方正中写上类似于“表3-1 .。表”的字样,不清楚可以看一下课本中是如何书写的。 5.使用说明应简明扼要,但也应该有相应的文字说明 6.课设总结要写你课设过程中遇到的诸多问题及解决方法,并且写出你的真实收获和感受,不应
24、少于1页。 7.参考文献按照模板中的格式书写。 8.字体大小和行间距等均参照模板进行修改,段首空两个汉字的宽度。全文同级字体应统一. 9.文档修改完成之后,修改页脚的“共?页”中的问号为你正文的页数,最后更新目录中的页码。10.全部修改完成,老师认可后再打印,打印纸张为16K.11.上交材料为报告和程序的压缩包(删除其中的debug目录). 请各位同学务必认真参照上面的注意事项一条条修改,谢谢!李智杰以上文档以李老师发给三班使用的模板为基础,做了一点点改动。衷心感谢李老师的辛勤工作!请大家极度重视报告的撰写!何箐祁飞附录资料:不需要的可以自行删除SHA算法的实现C语言程序:#include #
25、include /定义vector数组 #include /记录消息using namespace std; const int NUM = 8; /一个字由32比特(或者8个16进制数)const int BIT = 512; /消息认证码要以512比特一组 /字常量 string H0 = 67452301; string H1 = EFCDAB89; string H2 = 98BADCFE; string H3 = 10325476; string H4 = C3D2E1F0; /定义SHA1(安全哈希算法)类 class SHA1 public: /将一个字符串形式的字转化为vect
26、or数组 vector hex_into_dec(string word); /将vector转化为string字符串形式 string num_into_message(vector A); /两个字X和Y的逻辑和 vector word_AND(vector A,vector B); /两个字X和Y的逻辑或 vector word_OR(vector A,vector B); /两个字X和Y的逻辑异或 vector word_XOR(vector A,vector B); /两个字X和Y的逻辑补 vector word_COMPLEMENT(vector A); /两个字X和Y的摸232整
27、数加 vector word_ADD(vector A,vector B); /将字X循环左移s个位置 vector ROTL(vector A,int s); /SHA-1的填充方案,我们设定msg由ASCII码组成 vectorvector SHA_1_PAD(string msg); /将SHA-1压成以字为单位 vectorvectorvector compress(vectorvector result); /定义ft函数,每个ft函数都有B,C,D三个字作为输入,并产生一个字作为输出 vector Ft(int t,vector B,vector C,vector D); /定义字
28、常数K vector K(int t); /开始进行SHA-1(安全Hash算法)的加密 vectorvector SHA_1(string msg); ; /将vector转化为string字符串形式 string SHA1:num_into_message(vector A) int i; string msg = ; for(i = 0;i = 0 & Ai = 10 & Ai = 15) msg += A + (Ai - 10); return msg; /将一个字符串形式的字转化为vector数组 vector SHA1:hex_into_dec(string word) int i
29、; vector result(NUM,0); for(i = 0;i = 0 & wordi = A & wordi = F) resulti = 10 + wordi - A; return result; /两个字X和Y的逻辑和 vector SHA1:word_AND(vector A,vector B) vector result(NUM,0); int i; for(i = 0;i NUM;i+) resulti = Ai & Bi; return result; /两个字X和Y的逻辑或 vector SHA1:word_OR(vector A,vector B) vector r
30、esult(NUM,0); int i; for(i = 0;i NUM;i+) resulti = Ai | Bi; return result; /两个字X和Y的逻辑异或 vector SHA1:word_XOR(vector A,vector B) vector result(NUM,0); int i; for(i = 0;i NUM;i+) resulti = Ai Bi; return result; /两个字X和Y的逻辑补 vector SHA1:word_COMPLEMENT(vector A) vector result(NUM,0); int i; for(i = 0;i
31、NUM;i+) resulti = 15 - Ai; return result; /两个字X和Y的摸232整数加 vector SHA1:word_ADD(vector A,vector B) vector result(NUM,0); int i; for(i = NUM - 1;i = 0;i-) resulti = Ai + Bi; if(i != 0) int temp = resulti / 16; resulti-1 += temp; resulti %= 16; return result; /将字X循环左移s个位置 vector SHA1:ROTL(vector A,int s) vector result = A; vector temp(NUM,0); int i,j; for(i = 0;i = 0;j-) if(resultj / 8 = 1) tempj = 1; resultj = 1; resultj %= 16; if(j NUM - 1) resultj += tempj + 1; else if(resultj / 8 = 0) tempj = 0; resultj = 1; resultj %= 16;