汽车零部件采购管理程序ds.doc
HUBEI UNIVERSITY OF AUTOMOTIVE TECHNOLOGYC语言程序设计课程设计报告课设题目: 汽车零部件采购管理 专 业: 电子信息工程(汽车电子) 班 级: T1323-15 姓 名: 徐倩 成 绩: 完成日期: 2014年19周 指导教师: 吴年志 目录C语言程序设计0课程设计报告01.课程设计目的-12.需求分析22.1 要求22.2任务描述32.3运行环境42.4开发工具43.总体设计43.1系统流设计4 3.2系统模块设计54.详细设计64.1数据结构设计64.2 模块接口设计71)所有函数声明72)全局变量93)主要模块的实现94.3主要功能模块的流程图105.运行结果135.1 欢迎界面13 5.2 主菜单页面-135.3 信息查询页面145.4 统计菜单页面145.5 显示信息页面155.6 退出页面156.程序调试与测试166.1 主菜单选择测试166.2采购信息未从文件读入17 6.3采购信息输入调试-187.问题与不足208.建议219.编程体会2110.程序源代码211.课程设计目的1) 通过课程设计,加深对结构化程序设计思想的理解,能对系统功能进行分析,并设计合理的模块化结构。2) 通过课程设计,进一步掌握C语言中重要的数据结构。掌握并熟练运用指针、链表、结构体、文件等数据结构。3) 通过课程设计,提高程序开发能力,能运用合理的控制流编写清晰高效的程序。4) 通过课程设计,培养C语言知识运用和自学能力,真正的把课堂上获得的知识运用起来,培养自己对程序编写的兴趣,并能独立设计和实现一个小型系统。5) 通过课程设计,加强了自己的程序分析能力。2.需求分析2.1 要求1) 遵循软件开发过程的基本规范;能灵活应用,初步具备运用C程序解决实际问题的能力。2) 运用结构化程序设计方法,按照课程设计题目要求,完成包括需求分析、数据结构设计、概要设计、详细设计、编写代码、调试和测试C程序等过程。3) 学会利用数组、结构体、链表进行相关信息表示。4) 功能模块划分清晰,系统结构图符合功能操作要求,且有详尽的功能描述5) 各主要功能模块有详尽的流程图及描述,用函数的形式实现,且调用入口、功能、出口等关系正确。6) 所设计的C程序较好的可读性和可靠性;程序书写风格规范,注释清晰。7) 界面友好(良好的人机互交),凡需要输入信息时,都有较详尽的提示信息,并对输入信息有较完善的值域分析。8) 程序经上机调试通过,不应出现语法型、功能型错误,并获得满意的结果。9) 学会通过各功能性测试用例测试程序的能力,尽可能避免原则性错误的出现。10) 掌握编写、调试和测试C语言程序的基本技巧,充分理解结构化程序设计的基本方法。11) C语言课程设计报告的内容反应实际设计过程,且符合格式要求,无抄袭现象。2.2任务描述已知在汽车生产时,需要向零部件生产厂商采购零部件,设计一个汽车零部件采购管理程序,以方便采购管理部门对采购零部件的管理。该单位每次采购都有一个采购编号,每次采购一种零部件。该程序应该具有如下功能1) 添加并保存采购信息:输入采购编号,零部件名称,采购员名字,采购日期,采购价格,采购数量,供货单位,需要判断采购价格和数量是否大于零,采购编号是否已存在,采购日期是否合法(形如*-*-*,例如2013-09-08)。2) 根据采购编号查询零部件采购信息3) 根据零部件名称查询其采购信息4) 根据采购编号修改已有采购信息:需要判断修改后的采购编号的唯一性,采购日期的合法性(形如*-*-*,例如2013-09-08)。5) 根据采购编号删除此条采购信息6) 统计功能2.3运行环境VC+6.0编译环境2.4开发工具C语言3.总体设计3.1系统流设计程序整体功能结构如图一所示:开始显示课程以及学生信息显示主菜单,输入选择读取文件中的采购信息添加并保存采购信息由采购编号查找零部件采购信息由零部件名称查找其采购信息修改并保存采购信息删除并保存余下采购信息统计采购信息显示所有采购信息根据零部件名称统计其总数量根据采购员名字统计其采购次数3.2系统模块设计1) 封面模块 函数void huanying()和函数void byebye()构成封面模块,构造和谐人机环境。2) 菜单模块 函数void menu()和函数void choise()构成选择菜单,二级菜单void tongji()构成统计功能菜单。3) 查询模块 函数void numshow()和函数void nameshow()分别实现根据采购编号和零部件名称查询采购信息的功能,其中会有其他函数辅助。4) 信息处理模块 函数void change()实现信息修改功能,函数void disapperr()实现信息删除功能,void input()实现信息添加功能,void save()实现信息保存功能,void listCG()实现信息显示功能,其中会有其他函数辅助。5)统计模块 函数int number()实现根据零部件名称统计其总数量功能,int times()实现根据采购员名字显示其采购次数的功能,其中会有其他函数辅助。6)日期审查模块 函数 void checkdate()使用标志位方法实现对时间的审查。4.详细设计4.1数据结构设计根据系统要求,采购信息包括:数据项名称数据项系统表示数据类型数据长度备注采购编号P1->buynum字符串10零部件名称P1->itemname字符串10采购日期P1->day字符串30采购员名字P1->buyername字符串10采购数量P1->count整型4采购价格P1->price单精度8供货单位P1->source字符串10为了能实现系统的优越性和c语言的精华采用链表的建立采购信息记录表,示意图如下:采购信息2采购信息3采购信息14.2 模块接口设计1)所有函数声明viod huanying(); /*封面函数,显示课程题目,学生信息*/ void menu(); /*主菜单函数,显示各项功能*/void choise(); /*根据主菜单选择并执行功能*/void readinto(); /*读取文件内的采购信息*/void input(); /*从键盘添加采购信息并保存到文件中*/void listCG(); /*显示所有采购信息*/void numshow(); /*根据采购编号查询对应采购信息并显示*/void nameshow(); /*根据零部件名称查询其采购信息并显示*/void change(); /*根据采购编号修改并显示采购信息*/void disapper(); /*根据采购编号删除并显示余下采购信息*/void tongji(); /*统计功能菜单,显示两项统计功能*/int number(); /*根据零部件名称统计其购买总数量*/int times(); /*根据采购员名字统计其采购次数*/int checktime(int year,int month,int day );/*审查日期输入是否符合要求*/void byebye(); /*告别界面*/void save(); /*保存采购信息*/2)全局变量1,用于存储采购信息的结构体struct buy;2,判断文件是否正确读入的标志位变量int flag;3,用于存储采购信息的结构体指针:struct buy *head=NULL,*p,*p1,*p2,*p3.3)主要模块的实现系统以 int main()为入口,首先调用void huanying()显示课程名称和学生信息,调用void menu()和void choise()实现功能显示和功能选择。接着,按照用户的要求,调用void numshow()或void nameshow()实现查询功能,或调用void change(),void disapper()实现修改和删除功能.不管是删除还是修改还是添加都要调用void save()实现信息保存功能。添加和修改时还要调用int checktime(int year,int month,int day)函数对时间审查。当不需要再执行各项功能时,调用void byebye()退出管理器。4.3主要功能模块的流程图1) 封面模块(以欢迎界面为例,退出界面与此类似)显示题目和学生信息 进入系统2)菜单模块显示主菜单 接受用户输入选项否是否合法?退出管理系统是否是 执行用户所选功能否是是否合法?是否为7?否是是否为0?3) 查询模块(以根据采购编号查询采购信息为例) 返回主菜单页面显示编号对应采购信息编号是否存在 输入所查询采购编号主菜单4) 信息处理模块(以添加采购信息为例) 输入采购编号否是否是 显示添加信息 输入其他信息是否合格? 输入采购时间是否已存在5) 统计模块(以根据零部件名称统计采购总数量为例)是否s加上其数量返回主菜单是否存在?输入零部件名称,s=06)日期审查模块否是 返回0 返回1是否合格调用void checktime()函数输入采购时间,并将其表示成y,m,d5.运行结果5.1 欢迎界面5.2 主菜单5.3 信息查询页面5.4 统计菜单页面5.5 显示信息页面5.6 退出页面6.程序调试与测试测试数据:采购编号001001001002001003001004零部件名称活塞轮胎后视镜方向盘采购日期2013-09-272013-04-232013-09-082013-09-07采购员名字刘尧徐倩卫添翼李林琳采购数量90679089采购价格90.00000078.00000078.00000067.000000供货单位汽院十堰黄冈河南6.1 主菜单选择测试若用户输入错误选项,则如图显示:6.2采购信息未从文件读入6.3采购信息的输入测试1)若添加的采购编号已存在,则如图显示:2) 若添加的采购信息日期格式输入错误,则如图显示3) 若查询的采购编号输入错误,则如图显示4) 若查询的零部件名称输入错误,则如图显示5) 若输入价格为负数时,如图显示6) 若输入的数量为负值时,如图显示7.问题与不足1、需求分析中存在的问题 每次只能从键盘中添加一条采购信息,当遇到需要添加多条信息时,比较麻烦。统计功能太少,如果要求几个零部件的总价,无法实现。2、 程序中存在的缺陷 每次运行其他功能前都要先从文件中读入,比较耗时。有些功能输入错误时无法重新输入,而是直接跳到主菜单。缓存较多。8.建议题目应更加贴近生活,这样可以让同学们看到c语言的有用之处,激发同学们的学习热情。课程设计的题目涉及范围应该更广。程序设计的功能应相对更加复杂一点,这样有利培养同学们的分析问题,解决问题的能力,同时也能提高同学们对代码的掌握能力。再者,就是验收时应该要学生画出链表结构图,帮助他们更加深刻的掌握知识。9.编程体会 经历了编c语言课程设计后,我对这一学期c语言所学内容有了更加深刻的了解和掌握,特别是一直不懂的链表和指针,现在发现自己都能运用了,很开心自己的进步。所以,虽然写程序的过程中,遇到各种问题,调试的时候也是遇到各种令人头大的问题,但能借助课程设计提高自己对指针和链表的熟练度,提高自己对c语言编程的熟练度,也希望学校可以多开设一些这样的课程,既是让我们对自己所学知识的一个综合理解与使用,也可以提高我们的动手实践能力、对知识的运用能力,更是一个让我们学会独立思考的好机会。10.程序源代码#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<process.h> #include<string.h> #include<conio.h>#define LEN sizeof(struct buy) /申请结构体空间#define N 100/*申明程序中运用的函数*/void huanying(); /封面函数void readinto(); /读取文件void input(); /添加采购信息void listCG(); /显示采购信息void numshow(); /根据采购编号显示采购信息void nameshow(); /根据零部件名称显示采购信息void change(); /修改采购信息void disapper(); /删除采购信息void menu(); /显示主菜单void choise(); /选择所需功能void tongji(); /统计功能菜单int number(); /根据零部件名称统计采购的零部件总数量int times(); /根据采购员名字统计采购的零部件总数量int checkdate(int year,int month,int day); /检测时间void byebye(); /告别界面void save(); /保存文件/*定义全局变量*/struct buy /定义结构体char buynum10;char itemname10;char day30;char buyername10;int count;float price;char source10;struct buy *next;int flag=0;/*flag为文件是否以正确读入的标志位*/struct buy *head=NULL,*p,*p1,*p2,*p3; /*定义结构体指针*/*主函数*/int main()huanying();getch();while(1)menu();/*显示主菜单*/choise();/*显示选择功能*/return 0;/*封面函数*/void huanying()printf("nnntt*n"); printf("tt* *n"); printf("tt* c语言课程设计 *n"); printf("tt* *n"); printf("tt* 学生姓名:徐倩 *n"); printf("tt* 指导老师:吴年志 *n"); printf("tt* 班级:T1323-15 *n"); printf("tt* 学号:20130231538 *n"); printf("tt* 联系方式:18772961357(69180) *n"); printf("tt* *n"); printf("tt* 课程题目:汽车零部件采购管理程序 *n"); printf("tt* *n"); printf("tt*n"); fflush(stdin); printf("请按回车键继续······");/*告别界面*/void byebye()printf("nnntt*n"); printf("tt* *n"); printf("tt* *n"); printf("tt* *n"); printf("tt* *n"); printf("tt* *n"); printf("tt* *n"); printf("tt* *n"); printf("tt* *n"); printf("tt* *n"); printf("tt* *n"); printf("tt* 欢迎下次使用······ *n"); printf("tt*n");/*主菜单函数*/void menu()system("cls");printf("nnntt*欢迎使用汽车零部件管理系统*n");printf("tt | tttt|n");printf("tt |tt1,读取采购信息ttt|n");printf("tt | tttt|n");printf("tt |tt2,从键盘添加并保存采购信息t|n");printf("tt | tttt|n");printf("tt |tt3,根据采购编号查找零件信息t|n");printf("tt | tttt|n");printf("tt |tt4,根据零部件名称查找采购信息t|n");printf("tt | tttt|n");printf("tt |tt5,修改并保存采购信息tt|n");printf("tt | tttt|n");printf("tt |tt6,删除并保存余下采购信息t|n");printf("tt | tttt|n");printf("tt |tt7,统计采购信息ttt|n");printf("tt | tttt|n");printf("tt |tt8,显示采购信息ttt|n");printf("tt | tttt|n");printf("tt |tt0,退出管理系统ttt|n");printf("tt*n");/*读入文件函数*/void readinto()FILE *fp; /*文件指针*/ int n=0; if(fp=fopen("lingjian.txt","r")=NULL) /*打开文件时无此文件*/printf("文件打开错误:n"); exit(0); p1=(struct buy *)malloc(LEN); head=p1;p1->next =NULL; while(!feof(fp)/*读取文件内的信息*/fscanf(fp,"%s%s%s%s%d%f%s", p1->buynum,p1->itemname,p1->day,p1->buyername,&p1->count,&p1->price,p1->source); p2=(struct buy *)malloc(LEN); /*p2指向新申请的节点*/p1->next =p2; p3=p1; p1=p2; p1->next =NULL; free(p2); p3->next=NULL; fclose(fp);/*关闭文件*/ flag=1;printf("文件读取成功!n");listCG();/*选择所需功能函数*/void choise()int n;printf("-请从键盘输入您的选择(0-8内的整数):");scanf("%d",&n);while(n<0|n>8)printf("输入不合法,请再输入一次:");scanf("%d",&n);switch(n)case 1:system("cls");/*清屏*/readinto();break;case 2:system("cls");input();break;case 3:system("cls");numshow();break;case 4:system("cls");nameshow();break;case 5:system("cls");change();break;case 6:system("cls");disapper();break;case 7:system("cls");tongji();break;case 8:system("cls");listCG();break;case 0:system("cls");byebye();exit(0);/*从键盘添加并保存采购信息函数*/void input()int n=0,i=0,k;char ch;long y,m,d;if(flag=0) printf("未建立,采购信息数据库为空n"); printf("按任意键返回");getch(); return; printf("请输入将要添加的采购编号(形如001002,以回车键结束)n");fflush(stdin);scanf("%s",p2->buynum);p1=head;while(p1!=NULL)if(strcmp(p2->buynum,p1->buynum)=0)/*找到数据库信息中与输入相同的采购编号*/printf("你输入的采购编号已存在!");printf("对应零部件信息如下:");printf("采购编号:%sn",p1->buynum);printf("零部件名称:%sn",p1->itemname);printf("采购日期:%sn",p1->day);printf("采购员名字:%sn",p1->buyername);printf("采购数量:%dn",p1->count);printf("采购价格:%fn",p1->price);printf("供货单位:%sn",p1->source);n=1;/*标志位*/printf("请按任意键返回!n");getch();system("cls");break;p1=p1->next;if(n!=1)system("cls");p1=head;while(p1->next!=NULL) p1=p1->next;printf("请输入");p2=(struct buy *)malloc(LEN); /开辟一个新单元 fflush(stdin);for(i=0;i<7;i+)if(i=0)fflush(stdin);printf("采购编号(数字字符串型):");scanf("%s", p2->buynum);if(i=1)fflush(stdin);printf("零部件名称(文字或英文字符串型):");scanf("%s", p2->itemname);if(i=2)doprintf("采购日期(形如*-*-*,以回车键结束):");fflush(stdin);scanf("%s",p2->day);if(p2->day4='-'&&p2->day7='-'&&strlen(p2->day)=10)y=(p2->day0-48)*1000+(p2->day1-48)*100+(p2->day2-48)*10+(p2->day3-48);m=(p2->day5-48)*10+(p2->day6-48);d=(p2->day8-48)*10+(p2->day9-48);k=checkdate(y,m,d);/*根据函数返回值判断是否要重新输入*/if(k=1)break;while(1);if(i=3)fflush(stdin);printf("采购员名字(文字或英文字符串型,以回车键结束):");scanf("%s",p2->buyername);if(i=4)fflush(stdin);printf("采购数量(文字或英文字符串型,以回车键结束):");scanf("%d", &p2->count);while(p2->count<0)printf("数量不能为负数,请重新输入!n");scanf("%f",&p2->count);if(i=5) fflush(stdin);printf("采购价格(数字型,以回车键结束):");scanf("%f",&p2->price);while(p2->price<0)printf("价格不能为负数,请重新输入!n");scanf("%f",&p2->price);if(i=6)fflush(stdin);printf("供货单位(文字或英文字符串型,以回车键结束):");scanf("%s",p2->source);p2->next=NULL;p1->next =p2; p1=head;system("cls");printf("所有信息如下,请核实-");while(p1!=NULL)printf("采购编号:%sn",p1->buynum);printf("零部件名称:%sn",p1->itemname);printf("采购日期:%sn",p1->day);printf("采购员名字:%sn",p1->buyername);printf("采购数量:%dn",p1->count);printf("采购价格:%fn",p1->price);printf("供货单位:%sn",p1->source);printf("nnn");p1=p1->next;save();printf("按任意键返回");fflush(stdin);scanf("%c",&ch);/*根据采购编号查找采购信息函数*/void numshow()char anum10,ch;p1=h