资源描述
C语言课程设计目 录1、需求分析;2、系统总框图;3、每个模块的设计分析;4、列出所有定义的函数及说明;5、举例说明1、2个比较有特点的算法;6、数据分析。完备性、健壮性等;7、存在的问题与不足及对策;8、使用说明(操作手册);9、学习心得前 言计算机科学技术的发展,不仅极大地促进了整个科学技术的发展,而且明显地加快了经济信息化和社会信息化的进程。因此,计算机教育在全国备受重视,计算机知识与能力已成为21世纪人才素质的基本要素之一。如今,高等教育的计算机教育发展十分迅速。十多年前,只有部分理工科专业开设计算机课程。今天,几乎所有高校的所有专业都开设了程度不同的计算机课程。人们已经认识到,计算机知识已成为当代知识分子知识结构中不可缺少的重要组成部分。而除了掌握计算机的基础知识和操作的基本能力外,掌握一门高级编程语言,并可以熟练运用它,已成为当代大学生综合能力必要组成。计算机技术发展如此迅猛,计算机应用如此广泛,需要学习的东西愈来愈多,而我们的总学时是有限的。一般来说,计算机课程学习可以分为两部分:一部分是理论课程学习,一部分是上机应用实习。根据我们专业的性质和要求,则应侧重于上机操作运用。为此,学校特意在暑期最后一星期安排了32个学时的上机实习。现将一星期的实习内容及结果分析分列如下:物资管理系统一 题目要求1 编辑一个物资管理系统,能进行物资信息的录入,查询,打印和数据的修改。(1)物资信息录入:包括物资名称、编号、规格、入库时间、最大库存、最小库存、实际库存。(2)物资信息查询:可以分别以名称、日期、名称和规格查询。(3)新料入库:将新料的信息与以前储存的信息存在一起。(4)物资领取:在领料之后改变实际库存量。(5)物资打印:打印出库存的所有物资。2在课本要求的基础上,我在实习过程中又补充了一个功能即物资数据的更新,这主要是为了满足如果在信息录入的过程中将数据输错,可以在查询到错误后进行更改,同时如果新入库的物资是以前存在的,那么也可以用此功能进行入库数据输入。3要求数据以dat格式存放在硬盘上便于长期保存。二 需求分析根据题目要求,数据以dat的形式存储在硬盘上,所以应提供文件的输入,输出等操作;还需要文件具有查找,替换,修改数据的功能。总体设计根据上面的需求分析,可以将这个系统的设计分为如下七大模块:一、信息录入:在每次输入信息时提供必要的友情提示。提示包括:1.如果选择此项功能,那么之前的数据将被删除,只将此次数据存储;2.需要输入的数目,保证输入能够终止;3.输入信息时提示这是输入的第几个物资的信息。输入结束后以文件的形式储存。二、信息查找:按查询条件分为三个小模块。分别为以名称、日期、名称和规格查询模块。此模块只包含查询的目录和选择,然后分别进入每个小模块。1以名称查询:输入要查询物资的名称,系统将其与文件里的物资名称进行比较,如果找到匹配的那么将其打印出来,最后统计匹配物资数量。2.以日期查询:按要求输入查询物资入库日期,系统将其与文件里的物资入库时间进行比较,如果找到匹配的那么将其打印出来,最后统计匹配物资数量。3.以名称和规格查询:按要求输入要查询物资的名称和规格,系统将其与文件里的物资的名称和规格进行比较,如果找到匹配的那么将其打印出来,最后统计匹配物资数量。三、新料入库:打开文件,按要求输入数据后提供是否确定或从新输入的选择,输入数据在确定的情况下储存在原来已经存在的数据的后面。每次只能输入一个物资的数据。四、物资领取:输入要取出物资的名称、规格、入库时间,如果找到匹配的那么将库存实际量数据改变,输入要取出的量不能大于实际的库存量,否则输入数据无效。五、物资打印:打印出库存的物资的所有信息,便于使用者了解整体情况。六、数据更新:如果查询到库存信息有误,那么可以对其进行更改。如果需要入库的物资已经存在,那么只需要更改相应数据即可。也就是可以用此功能对已经存储的所有信息进行更改。七、退出:退出整个系统。物资管理系统信息录入信息查询新料入库物资打印数据更新退出物资领取三 详细设计1 主函数为了各模块的独立性,主函数设计得比较简单,本系统主要用主函数打开做一个封面的打印,包含我的个人信息,然后进入主菜单选择操作。流程图打印出我的资料,任意键继续进入主菜单函数程序/*主函数*/main() /*主函数*/ puts(nnnntt欢迎使用物资管理系统); puts(ttName:杨超 ); puts(ttNumber:20071001560 ); puts(ttE-mail: ); puts(ttTel:15872351704 ); puts(tt ); puts(tt*杨超 ); puts(tt*2009.1.2 ); puts(tt); printf(nttt 按任意键继续); getch(); menu();2 主菜单函数流程图显示一系列功能选项输入n,判断n是否是1-7根据n的值调用各功能模块函数是否程序menu() /*菜单函数*/ int n,m; do puts(ntt*菜单*nn); puts(ttt1.物资信息录入); puts(ttt2.物资信息查询); puts(ttt3.新料入库); puts(ttt4.物资领取); puts(ttt5.物资打印); puts(ttt6.物资数据更新); puts(ttt7.退出); puts(nntt*n); puts(tt*杨超n); puts(tt*2009.1.2n); printf(选择操作 1-7: bb); scanf(%d,&n); if(n7) m=1;getchar(); else m=0; while(m=1);switch(n) /*分别进入各函数*/ case 1:write();break; /*录入函数*/ case 2:search();break; /*查询函数*/ case 3:insert();break; /*新料入库函数*/ case 4:lend();break; /*领料函数*/ case 5:print();break; /*打印函数*/ case 6:rewrite();break; /*信息更改*/ case 7:exit(0); /*退出*/ 各功能模块设计(1) 物资信息录入/*物资信息录入函数*/建立一个write函数用于第一次存储信息。用printf函数打印出提示语(提示:请确定这是你第一次录入信息,因为之前保存的数据将被删除),然后用scanf函数接受一个数据给k,用if语句判断k是否为0。如果继续则输入0,那么此时if(k!=0)为假,不执行if后面的语句。否则用printf_back()调回到主目录。选择继续之后,用printf函数提示输入需用录入的物资的数量,同时提示最大数字。然后用printf提示现在开始输入信息,执行input()函数开始输入相关信息。输入信息执行后,用if(i!=0)判断是否已经输入信息,如果输入有数据那么i执行了循环,则if(i!=0)语句为真,执行save函数进行保存。没有执行i循环则if(i!=0)为假,直接执行printf函数跳到主目录。代码如下:write()int i,n,k; printf(nnt提示:请确定这是你第一次录入信息,因为之前保存的数据将被删除!nn); printf(ttt是否继续!nnttt0 *是nnttt其它 *否 bb); scanf(%d,&k); if(k!=0) printf_back(); printf(n需要录入物资数量(0-%d)?:,N-1); /*N是宏定义,可以随时改变其值*/ scanf(%d,&n); printf(n现在输入信息nn); for(i=0;in;i+) printf(n现在输入第 %d个物资的信息:n,i+1); input(i); if(i!=0)save(n); printf_back(); /*查询函数*/本函数只包含跳转到查询目录函数,然后执行查询目录。打码如下:search() searchmenu();物资信息查询:1、/*以日期查询函数*/建立日期结构体。struct search_dateint year; int month; int day;s;search_by_date()int j,n,m=0;打开文件到内存,使可以对数据进行操作。 n=load(); 提示语:printf(n输入你所查询信息的日期!ndate:); 输入数据分别赋值给日期中的年月日。scanf(%d.%d.%d,&s.year,&s.month,&s.day);用for循环使输入的日期与数据中的每一个日期进行比较。 for(j=0;jn;j+)判断输入的日期与当前物资的日期是否相同,如果相同则if为真,用m统计相同日期的物资的个数。打印出满足条件的物资的信息。if(s.year=proj.in_date.year)&(s.month=proj.in_date.month)&(s.day=proj.in_date.day) m+; printf_data(j);打印出满足条件物资的数量。printf(n有%d种物资与查询相匹配!,m);按任意键返回到主函数。getch();menu();/*以名称查询函数*/search_by_name()int j,n,m=0;char a20;打开文件,使能对文件中的数据进行操作。 n=load(); 提示语言printf(n输入你所查询信息的名称!nname:); 输入一个字符数据赋值给ascanf(%s,a);用for循环使a与文件中的每一个数据进行判断,如果相同则打印出来同时用m统计相同的个数。 for(j=0;jn;j+) if(strcmp(a,proj.p_name)=0) m+; printf_data(j); 打印出相同个数的数量。printf(n有%d种物资与查询相匹配!,m);任意键返回getch();menu();/*以名称和规格查询函数*/search_by_nameandsize()int j,n,m=0;char a20,b4;打开文件使能对数据进行操作。 n=load(); 提示输入语,将输入的字符数据赋值给aprintf(n输入你所查询信息的名称!nname:); scanf(%s,a);提示输入语,使输入的字符数据赋值给b printf(n输入你所查询信息的规格!nsize:); scanf(%s,b);用for语句使输入的名称和规格数据与内存中的每一个数据进行比较。 for(j=0;jn;j+)如果数据与当前数据相同,打印出数据,同时用m统计相同个数。 if(strcmp(a,proj.p_name)=0)&(strcmp(b,proj.size)=0) m+; printf_data(j); 打印出匹配物资的个数。printf(n有%d种物资与查询相匹配!,m);任意键返回主菜单。getch();menu();新料入库/*新料入库函数*/insert()int n,c;打开文件使能对数据进行操作。 n=load(); puts(n请输入相关信息:n);用dowhile循环判断是否从新输入。 do 进入input函数输入新料的相关数据。input(n);调用printf_data函数打印出刚输入的新料的相关数据。 printf_data(n);按提示语进行下一步操作。 printf(nn是否确定输入n1 ).是n2 ).从新输入n其它).返回 bb);接受一个数据赋值给c,如果c=1,那么将新输入的数据保存。如果c!=1且c!=2,那么返回到主函数,如果c=2那么从新输入新料的数据。 scanf(%d,&c); if(c=1) save(n+1);printf_back(); else if(c!=2)menu(); while(c=2);物资领取/*领料函数*/lend()int j,n,k=0;打开文件使能对数据进行操作。 n=load();由于数据类型很重要,因此输出提示语,使按照提示操作。 printf(n请输入你需要物资内容的相关信息!); printf(n名称(1-20字母)t规格(1-4字母)t入库日期t领取数量n);输入数据,分别赋值给名称、规格和入库日期,同时输入领取量。scanf(%st%st%d.%d.%dt%d,&take.p_name,&take.size,&take.one_date.year,&take.one_date.month,&take.one_date.day,&take.total);用for循环判断要领取的物资是否存在与库中,同时判断领取量是否小于库存量。 for(j=0;jn;j+)if(strcmp(take.p_name,proj.p_name)=0)&(strcmp(take.size,proj.size)=0)&(take.one_date.year=proj.in_date.year)&(take.one_date.month=proj.in_date.month)&(take.one_date.day=proj.in_date.day)&(take.total=proj.real_s)如果存在物资,那么领取物资,库存的实际数量更新,打印出领料后物资的信息,同时使k=1。 proj.real_s-=take.total; printf_data(j); k=1; 如果不存在物资,那么k的值不变为0,则执行if语句返回到主菜单。if(k=0) printf(输入数据未找到!);getch();menu();领料后保存数据,返回到主菜单。save(n);printf_back();物资打印/*打印函数*/print()int i,n;将文件的数据读到内存中,使能对数据进行处理。 n=load();用for循环打印出从文件中读出的每一个数据。 for(i=0;in;i+) printf_data(i);任意键返回。 puts(nnttt任意键返回); getch(); menu();物资数据更新/*信息更改函数*/rewrite()char p_name20;long int p_num; char size4;int m,n,j,k=0;读入文件中的数据,使能对其进行操作。 n=load();用dowhile语句执行循环输入。 do puts(n要更改物资的信息:名称 编号 规格);赋值给名称、编号、规格,打印出输入的信息,接受数据判断选择操作。 scanf(%s%ld%s,&p_name,&p_num,&size); printf(名称:%stt编号:%ldtt规格:%s,&p_name,p_num,&size); printf(nnnnttt是否继续!nnttt0 *是nnttt1 *退出nnttt其它 *重新输入 bb);根据提示信息输入一个值给m,如果退出则输入1,那么if(m=1)为真,返回到主菜单;如果要继续则输入为0,k赋值为1,那么while语句为假,进行后面的操作;重新输入则输入除0和1以外的数据,那么k=0,while(k!=1)为真,执行重新输入。 scanf(%d,&m); if(m=1) printf_back(); else if(m=0) k=1; while(k!=1);用for循环判断要更改的物资是否存在,如果存在调入input函数,重新输入物资的信息,保存新信息,返回到主菜单。 for(j=0;jn;j+) if(strcmp(p_name,proj.p_name)=0)&(p_num=proj.p_num)&(strcmp(size,proj.size)=0) puts(n请重新输入信息n); input(j); save(n); printf_back(); 如果没有一个匹配,提示未找到返回主菜单。 puts(未找到n按任意键返回!); getch(); menu();退出如果输入为7那么直接用exit(0);结束整个程序。各函数及说明main() 包括个人说明和调入menu()函数。menu() 打印出各个功能菜单,选择需要操作的功能,进入各功能。input() 输入物资的名称、编号、规格、入库时间、库存最大最小和实际量。代码如下:input(int i) /*输入函数*/printf(n名称(1-20字母):); scanf(%s,&proi.p_name); printf(n编号(1-7数字):); scanf(%d,&proi.p_num); printf(n规格(1-4字母):); scanf(%s,&proi.size); printf(n入库日期(年.月.日):); scanf(%d.%d.%d,&proi.in_date.year,&proi.in_date.month,&proi.in_date.day); printf(n数量库存最小-实际-最大:); scanf(%d-%d-%d,&proi.min_s,&proi.real_s,&proi.max_s);insert() 新料入库函数,调入input()函数,将输入的信息存储在原信息的后面,提供是否继续的选择操作。lend() 领料入库函数,输入物料信息,查找物料是否存在,如果存在则取出相应数量的物料,改变相应库存信息并保存,若不存在,打印出提示。load() 从文件中读入物资库存信息到内存,使可以对数据进行操作。代码如下:load() /*从文件读入函数*/ FILE*fp; /*定义指针*/ int k; if(fp=fopen(pro.dat,rb)=NULL) /*以只读方式打开一个二进制文件,打开失败给出提示*/ printf(n文件打开失败!n); return NULL; for(k=0;!feof(fp);k+) /*打开成功将其所有数据读入一次到内存中*/ fread(&prok,sizeof(struct product),1,fp); fclose(fp); /*关闭指针*/ return(k-1); /*给出返回值使能对读入的数据进行准确操作*/print() 打印出库存每一条信息。代码如下:print()int i,n; n=load(); for(i=0;in;i+) printf_data(i); puts(nnttt任意键返回); getch(); menu();print_back() 操作完成后返回到主菜单的函数。代码如下:printf_back() /*返回提示函数*/printf(nn操作完成nn按任意键返回!n); getch(); menu();print_data() 打印出名称、编号、规格、日期、库存最小-实际-最大。代码如下:printf_data(int i) /*打印函数*/printf(n名称tt编号t规格t日期tt库存最小-实际-最大n);printf(%stt%dt%st%d.%d.%dtt%d-%d-%d,proi.p_name,proi.p_num,proi.size,proi.in_date.year,proi.in_date.month,proi.in_date.day,proi.min_s,proi.real_s,proi.max_s);rewrite() 信息更改函数,可更改库存中的人以信息。save() 将内存中的数据保存到硬盘中。代码如下:save(int n) /*保存函数*/FILE*fp; /*定义指针*/ int k; if(fp=fopen(pro.dat,wb)=NULL) /*以只写的方式打开一个二进制文件,文件名为pro.dat printf(n文件打开失败!n); 如果打开失败给出提示*/ return NULL; for(k=0;kn;k+) /*打开成功则将内存中的物资信息存到硬盘上*/ if(prok.real_s!=0) if(fwrite(&prok,sizeof(struct product),1,fp)!=1) printf(文件存储失败n); /*存储失败给出提示*/ fclose(fp);search() 调入查询菜单函数。search_by_name() 以名称为条件查询函数,找到名称相同的物料,调用print_data()函数打印出匹配的物料信息。search_by_date()以日期为条件查询函数,找到入库时间相同的物料,调用print_data()函数打印出匹配的物料信息。search_by_nameandsize()以名称和规格为条件查询函数,找到信息相同的物料,调用print_data()函数打印出匹配的物料信息。searchmenu() 打印出提示信息,使按要求操作,根据输入的信息不同进入各个不同查询条件函数。searchmenu()int n,w2; do puts(ntt*查询目录*nn); puts(ttt1.以名称查询); puts(ttt2.以日期查询); puts(ttt3.以名称和规格查询); puts(ttt4.返回); puts(nntt*n); printf(选择命令 1-4: bb); scanf(%d,&n); if(n4) w2=1;getchar(); else w2=0; while(w2=1); switch(n) /*跳转到查询函数*/ case 1:search_by_name();break; /*转入以名称查询函数*/ case 2:search_by_date();break; /*转入以日期查询函数*/ case 3:search_by_nameandsize();break; /*转入以名称和规格查询函数*/ case 4:getch();menu(); /*跳转到菜单函数*/ write() 将物资信息读入到内存中并保存在硬盘中。时间结构体struct dateint year; int month; int day;领料时需要输入的产品信息结构体struct one_prochar p_name20;long int p_num; char size4; struct date one_date; long int total; struct one_pro *next;take;保存文件的产品信息结构体struct productchar p_name20; long int p_num; char size4; struct date in_date; long int max_s; long int min_s; long int real_s; struct product *next;proN;查询日期的结构体struct search_dateint year; int month; int day;s;操作展示截图:开始界面:提示语后输入信息:输入信息后选择打印结果:a的编号为1000规格为xxl入库日期为2009.1.8库存实际量为58。以名称查询结果:以日期查询结果:以名称和规格查询结果:新料入库界面:领取a物资5个单位后,a的库存实际量为53物资数据更新后,a名称改为aa,编号为1008,规格为xxx,入库日期为2009.1.10,库存信息也相应改变,同时上次输入的新料的信息也存储了进去:程序特点和个人总结: 本程序是自己的劳动结果,由于是第一次学习程序语言,接触程度不深,因此编写的语言非常简单,全部使用的是一些常见的语言结构,读起来也比较容易。同时由于是初学,因此写出的程序代码也显得比较浅略,对于编程高手来说显得平淡如水,这是今后需要改正的地方。但是由于程序是分模块编写的,看起来也比较简练,不会显得杂乱。同时有一个问题还没有解决。问题如下:menu() int n,m; do puts(ntt*菜单*nn); puts(ttt1.物资信息录入); puts(ttt2.物资信息查询); puts(ttt3.新料入库); puts(ttt4.物资领取); puts(ttt5.物资打印); puts(ttt6.物资数据更新); puts(ttt7.退出); puts(nntt*n); puts(tt*杨超n); puts(tt*2009.1.2n); printf(选择操作 1-7: bb); scanf(%d,&n); if(n7) m=1;getchar(); else m=0; while(m=1);开始没有加入getchar函数,程序陷入死循环,分析了很久也没有找到原因。后来在网上搜索了一个相似的代码,依葫芦画瓢加上getchar()问题才解决。但是在北区的机房调试程序时,没有getchar()也没有陷入死循环。 程序中使用汉字时有时会无故失灵,不改变程序重新调试又正常运行,这也是自己需要学习的一点。使用说明:本程序交互性很强,在每次输入数据时都有提示,因此完全可以在程序中操作自如。但需要注意的一点是,输入数据时,一定要保证与提示的类型相同,否则将出现无法预料的结果。如下:按日期查询数据时输入日期为we时,出现的结果就显得莫名其妙。
展开阅读全文