c语言课程设计之实验设备管理系统_第1页
c语言课程设计之实验设备管理系统_第2页
c语言课程设计之实验设备管理系统_第3页
c语言课程设计之实验设备管理系统_第4页
c语言课程设计之实验设备管理系统_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录目录.-1 -一设计目的.-2 -二课程设计的内容.-2 -三课程设计的要求与数据.-2 -四课程设计应完成的工作.-2 -五总体设计(包含几大功能模块流程图).-2 -六详细设计(各功能模块的具体实现算法流程图).-3 -七调试分析(包含各模块的测试用例,及测试结果).-8-八总结.-17 -九成员设计内容.-17-十参考资料.-17 -一:设计目的练习与巩固C语言程序设计)理论知识,通过实践检验和提高实际能力,进一步培养自己综合分析问题和解决问题的能力。掌握运用C语言独立地编写、调试应用程序和进行其它相关设计的技能。二:课程设计内容实验室设备管理系统三:课程设计要求实验设备信息包括:设备编号,设备种类(如:微机、打印机、扫描仪等等),设备名称,设备价格,设备购入日期,是否报废,报废日期等。主要功能:1 完成对设备信息的录入函数2 完成修改某个设备信息的函数3 根据给定信息对设备进行分类统计4 设备的破损耗费和遗损处理(删除某个指定设备)5 设备的查询四:课程设计应完成的工作(1)编写算法;(2)算法测试,并有具体的测试结果和结果分析;(3)撰写课程设计报告。内容包括: 1) 封面扉页 2) 设计任务书 3) 目录 4) 总体设计方案(包括流程图) 5) 使用说明及运行实例(包括界面) 6) 成员设计内容简介 7) 项目源程序代码(注意注释的使用) 8) 指导教师评语 五 总体设计(包含几大功能模块)1、 功能1:打开一个设备信息文件,并读取2、功能2:添加新的设备内容并保存3、功能3: 统计设备数量4、功能4:查找符合条件的设备及其数量并将其显示出来5、功能5:对设备信息按条件进行分类排序6、功能6:修改设备信息7、功能7:删除某条设备记录8、功能8:显示内容六:详细设计开始菜单添加修改查看删除显示分类查找结束读取文件关闭文件图1 系统框图图2 菜单图思路:使用文件的方式读取和写入设备信息,文件保存在一个固定路径,并以固定的名称进行读取和修改,因此对文件名和路径进行宏定义。设备内容根据需求定义了结构体如下:struct instrumentchar id10,kind10,name10,price10,in_date10,reject10,out_date10;结构体内元素分别为编号、种类、名称、价格、购入日期、是否报废、报废期限等,为了方便操作均以字符串的形式进行保存。以下为程序重要功能图:(1) 对文件的操作FILE *fp; fp=fopen(filename,a); a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾 ,这种用法是为了 主要是用于添加新的信息在文件末端,用在添加设备函数内。fp=fopen(filename,r);以只读方式打开,用在需要读取设备信息的函数的内。 fp=fopen(filename,w);以只写形式打开,用于需要改动信息并保存的函数文件读取修改写入关闭图3 文件操作流程图以上是对文件的读取,读取完成后便可以进行内容的操作。(2) 添加函数additem() fp=fopen(filename,a); /a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾. 文件读取添加在文件尾部写入关闭继续YN图4 添加操作流程图。(3) 统计文件内信息量load()该函数用于统计文件内设备数量以便于读取,当文件内设备读取到空行(检测到EOF)返回行数。流程图:读取检测输出EOF?nY+1图5 文件尾检测流程图 (4)查找check()在读取出文件内容后比对条件进行查找,如果符合条件输出,由于内容均以字符串的方式保存,因此便于查找。文件读取输入关闭相同YNEOF?YN图6 查找操作流程图(5)分类sort()按某种条目进行分类也是需要通过查找相同,但不同的是条目的具体内容是不确定的,只是把条目内容相同的部分进行排序使其归类在一起,使用了冒泡排序法。由于是使用字符串,所以排序的依据是根据ASCII码顺序。文件读取显示与第i+1个交换,并令i=i+1第m个与第i个相同NY输入分类类型m+i=j;写入从第j个开始m=emdj=emd关闭NJ=i+1i=j=0;Y(6)修改modify()原理:在读取文件保存在内存后,按行选择修改某一行即修改结构体数组的某一元素,在将其写入到文件中。文件读取显示关闭继续NY输入行号条目修改写入图7 修改操作流程图(7)删除delect()读取文件内容,但读写时跳过需要删除的行不读,然后把读取出的内容重新写入文件文件读取显示关闭输入行号写入并跳过该行图8 删除操作流程图(8)显示数据函数show()文件读取显示关闭图9 显示操作流程图七:调试分析7.1源程序及注释以下为程序重要功能函数:(1)对文件的操作(使用文件流操作相关函数)FILE *fp; fp=fopen(filename,a); a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾 ,这种用法是为了 主要是用于添加新的信息在文件末端,用在添加设备函数内。fp=fopen(filename,r);以只读方式打开,用在需要读取设备信息的函数的内。 fp=fopen(filename,w);以只写形式打开,用于需要改动信息并保存的函数内。读取文件(部分程序)(对行数据部分使用可以连续分割字符串strtok函数,还有字符串复制函数memccpy)读取文件用于显示和修改char mystring2100,*t=; i=load(filename);/读取文件数量if(i=-1|i=0)/如果文件打开失败或文件内没有内容 printf(cant open file or file has no data);return;for(n=0;n i;n+) fgets (mystring2,100,fp);/按行的方式一行行显示文件该程序段出现过的问题:由于统计上面统计文件行数的函数的问题导致漏读。以上程序段只是按行读取文件,并没有对没一行文件内容,如编号、种类等区分出来,上面适用于单纯的显示设备信息(show()函数)。在要对文件信息进行改动的函数内,还需要把行内容按结构体内容进行读取,加上以下函数段,采用了字符函数对行内容进行分割和复制 即可。if(n!=0) memccpy(a,strtok(mystring2,t),;,10); memccpy(eupn.id,strtok(NULL,t),NULL,10); /将行内容以;分割,并把分割返回的值以10个字节形式返回 else memccpy(eupn.id,strtok(mystring2,t),;,10); memccpy(eupn.kind,strtok (NULL,t),NULL,10); memccpy(,strtok (NULL,t),NULL,10); memccpy(eupn.price,strtok (NULL,t),NULL,10); memccpy(eupn.in_date,strtok (NULL,t),NULL,10); memccpy(eupn.reject,strtok (NULL,t),NULL,10); memccpy(eupn.out_date,strtok (NULL,t),NULL,10); fclose(fp);以上是对文件的读取,读取完成后便可以进行内容的操作。问题:起初因为要求里没要求用文件方式保存所以没有用文件写了一个程序,但后来写了1/3想了想应该不会那么简单就改用文件,结果浪费了很多时间。但用了文件的方式后发现有些函数写起来更加简单。例如在删除函数,如果不用文件而将数据保存在内存中时要删除就得对链表进行修改,而改用文件后只需要把跳过删除的数据把数据重新写入文件。此外,用了文件的方式后不用处理链表这样困难的结构。(2)添加函数additem()FILE *fp; /打开文件 fp=fopen(filename,a); /a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾 printf(请输入编号:); scanf(%s,into.id); printf(n); printf(请输入种类:); scanf(%s,into.kind); printf(n); printf(请输入名称:); scanf(%s,); printf(n);j=0;do printf(请输入价格:); scanf(%s,into.price); printf(n); j=isnumber(into.price); if(j=0) printf(输入错误n);while(j=0);j=0;do printf(请输入购入日期:); scanf(%s,into.in_date); printf(n); j=isnumber(into.in_date); if(j=0) printf(输入错误n);while(j=0); printf(是否报废(写Y或N):); scanf(%s,into.reject);j=0;do printf(请输入报废期限:); scanf(%s,into.out_date); printf(n); j=isnumber(into.out_date); if(j=0) printf(输入错误n);while(j=0); if(load(filename)!=0) fprintf(fp,r);fprintf(fp,t%st%st%st%st%st%st%strn,into.id,into.kind,,into.price,into.in_date,into.reject,into.out_date); fclose(fp); printf(nnt添加成功 nn); 函数出现过的问题:由于n ,rn的分不清一开始每一行的结尾使用n的,导致下面读取时会少一行,通过网络查阅资料后,在第一行前加r,每行末尾加rn解决了问题。(3)统计文件内信息量load()该函数用于统计文件内设备数量以便于读取,当文件内设备读取到空行(检测到EOF)返回行数。int load(char file) char c; int h=0; FILE *fp; fp=fopen(file,r); if(fp=NULL) return -1;/表示文件打开错误 fseek(fp,0,0); while(c=fgetc(fp)!=EOF) if(c=n) h+; else if(c=EOF) h+; break; fclose(fp); return h; 该函数出现过的问题:起初有时无法正确读取文件,原因是在additem这个函数里添加的格式不对,把additem这个函数改后就可以了。(4)查找check()在读取出文件内容后比对条件进行查找,如果符合条件输出,由于内容均以字符串的方式保存,因此便于查找。if(i=1)/i为输入的查找条目 for(n=0,k=0;nj;n+) if(strcmp(q,eupn.id)=0)/=0,符合条件并输入 printf(在文件中第%d行n,n); printf(“_n”);printf(%s;%s;%s;%s;%s;%s;%s;n,eupn.id,eupn.kind,,eupn.price,eupn.in_date,eupn.reject,eupn.out_date);k+;/这个是用来统计符合条件设备的数量的 if(k=0)printf(has no datan);(5)分类sort()按某种条目进行分类也是需要通过查找相同,但不同的是条目的具体内容是不确定的,只是把条目内容相同的部分进行排序使其归类在一起,使用了冒泡排序法。由于是使用字符串,所以排序的依据是根据ASCII码顺序。 if(c=3) for(n=0;nj-1;n+) for(k=0;kj-1-n;k+) if(strcmp(eupk.reject,eupk+1.reject)0) exchange=eupk; eupk=eupk+1; eupk+1=exchange; (6)修改modify()原理:在读取文件保存在内存后,按行选择修改某一行即修改结构体数组的某一元素,在将其写入到文件中。 printf(n 输入你要修改的设备的行数! nn 实验设备的行数:); scanf(%d,&n); printf(n 找到要修改的设备! n); b=2; do printf(n 请输入你要修改的1:编号 2:种类 3: 名称 4:价格 5:购入日期 6:报废 7:报废期限:n); scanf(%d,&c); switch(c) case 1: printf(请输入编号:);scanf(%s,eupn.id); printf(n);break; case 2:printf(请输入种类:);scanf(%s,eupn.kind);printf(n);break; case 3: printf(请输入名称:);scanf(%s,);printf(n);break; case 4:printf(请输入价格:);scanf(%s,eupn.price);printf(n);break; case 5:f=0;do printf(请输入购入日期:); scanf(%s,eupn.in_date); printf(n); f=isnumber(eupn.in_date); if(f=0) printf(输入错误n); while(f=0); printf(n); break; case 6:printf(是否报废(写Y或N):);scanf(%s,eupn.reject); printf(n);break; case 7:f=0;do printf(请输入报废期限:); scanf(%s,eupn.out_date); printf(n); f=isnumber(eupn.out_date); if(f=0) printf(输入错误n);while(f=0); printf(n); break; default :break; printf(接下来 1:对该设备信息修改完成 2:还需要对该设备进行修改n); scanf(%d,&b); while(b!=1)&(b!=2) printf(输入错误,接下来 1:对该设备信息修改完成 2:还需要对该设备进行修改n); scanf(%d,&b); while(b=2); fp=fopen(filename,w); fseek(fp,0,0); fprintf(fp,t%st%st%st%st%st%st%strn,eup0.id,eup0.kind,,eup0.price,eup0.in_date,eup0.reject,eup0.out_date); for(n=1;nj-1)printf(输入的行数大于实际行数,重新输入);scanf(%d,&i);fp=fopen(filename,r);fseek(fp,0,0);/以行为单位一行行的读取,但最多肚100个字节for(n=0;nj;n+)if(n!=i)if(k=0)fgets(mystring2n,100,fp);elsefgets(mystring2n-1,100,fp);elsefgets (stri,100,fp);k=1;fclose(fp);fp=fopen(filename,w); fseek(fp,0,0);for(n=0;nj-1;n+)fprintf(fp,%s,mystring2n);fclose(fp);(8)显示数据函数show()char mystring2100,*t=; i=load(filename);/读取文件数量if(i=-1|i=0)/如果文件打开失败或文件内没有内容 printf(cant open file or file has no data);return;for(n=0;n i;n+) fgets (mystring2,100,fp);/按行的方式一行行显示文件7.2 调试与测试课程设计中出现的问题:在上面的每一部分程序段中有说明。调试:(1) 显示show()图10 显示内容界面图(2) 修改modify()界面图11 修改界面图修改后显示图12 修改结果(3) 删除delect()图13 删除界面 删除后图14 修改界面(4)添加addItem() 图15 添加界面图16 添加前图17 添加后(4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论