1、C语言课程设计目 录1、需求分析;2、系统总框图;3、每个模块设计分析;4、列出全部定义函数及说明;5、举例说明1、2个比较有特点算法;6、数据分析。完备性、健壮性等;7、存在问题和不足及对策;8、使用说明(操作手册);9、学习心得前 言计算机科学技术发展,不仅极大地促进了整个科学技术发展,而且显著地加紧了经济信息化和社会信息化进程。所以,计算机教育在全国备受重视,计算机知识和能力已成为二十一世纪人才素质基础要素之一。现在,高等教育计算机教育发展十分快速。十多年前,只有部分理工科专业开设计算机课程。今天,几乎全部高校全部专业全部开设了程度不一样计算机课程。大家已经认识到,计算机知识已成为现代知
2、识分子知识结构中不可缺乏关键组成部分。而除了掌握计算机基础知识和操作基础能力外,掌握一门高级编程语言,并能够熟练利用它,已成为现代大学生综合能力必需组成。计算机技术发展如此迅猛,计算机应用如此广泛,需要学习东西愈来愈多,而我们总课时是有限。通常来说,计算机课程学习能够分为两部分:一部分是理论课程学习,一部分是上机应用实习。依据我们专业性质和要求,则应侧重于上机操作利用。为此,学校特意在暑期最终一星期安排了32个课时上机实习。现将一星期实习内容及结果分析分列以下:物资管理系统一 题目要求1 编辑一个物资管理系统,能进行物资信息录入,查询,打印和数据修改。(1)物资信息录入:包含物资名称、编号、规
3、格、入库时间、最大库存、最小库存、实际库存。(2)物资信息查询:能够分别以名称、日期、名称和规格查询。(3)新料入库:将新料信息和以前储存信息存在一起。(4)物资领取:在领料以后改变实际库存量。(5)物资打印:打印出库存全部物资。2在书本要求基础上,我在实习过程中又补充了一个功效即物资数据更新,这关键是为了满足假如在信息录入过程中将数据输错,能够在查询到错误后进行更改,同时假如新入库物资是以前存在,那么也能够用此功效进行入库数据输入。3要求数据以dat格式存放在硬盘上便于长久保留。二 需求分析依据题目要求,数据以dat形式存放在硬盘上,所以应提供文件输入,输出等操作;还需要文件含有查找,替换,
4、修改数据功效。总体设计依据上面需求分析,能够将这个系统设计分为以下七大模块:一、信息录入:在每次输入信息时提供必需友谊提醒。提醒包含:1.假如选择此项功效,那么之前数据将被删除,只将此次数据存放;2.需要输入数目,确保输入能够终止;3.输入信息时提醒这是输入第多个物资信息。输入结束后以文件形式储存。二、信息查找:按查询条件分为三个小模块。分别为以名称、日期、名称和规格查询模块。此模块只包含查询目录和选择,然后分别进入每个小模块。1以名称查询:输入要查询物资名称,系统将其和文件里物资名称进行比较,假如找到匹配那么将其打印出来,最终统计匹配物资数量。2.以日期查询:按要求输入查询物资入库日期,系统
5、将其和文件里物资入库时间进行比较,假如找到匹配那么将其打印出来,最终统计匹配物资数量。3.以名称和规格查询:按要求输入要查询物资名称和规格,系统将其和文件里物资名称和规格进行比较,假如找到匹配那么将其打印出来,最终统计匹配物资数量。三、新料入库:打开文件,按要求输入数据后提供是否确定或从新输入选择,输入数据在确定情况下储存在原来已经存在数据后面。每次只能输入一个物资数据。四、物资领取:输入要取出物资名称、规格、入库时间,假如找到匹配那么将库存实际量数据改变,输入要取出量不能大于实际库存量,不然输入数据无效。五、物资打印:打印出库存物资全部信息,便于使用者了解整体情况。六、数据更新:假如查询到库
6、存信息有误,那么能够对其进行更改。假如需要入库物资已经存在,那么只需要更改对应数据即可。也就是能够用此功效对已经存放全部信息进行更改。七、退出:退出整个系统。物资管理系统信息录入信息查询新料入库物资打印数据更新退出物资领取三 具体设计1 主函数为了各模块独立性,主函数设计得比较简单,本系统关键用主函数打开做一个封面打印,包含我个人信息,然后进入主菜单选择操作。步骤图打印出我资料,任意键继续进入主菜单函数程序/*主函数*/main() /*主函数*/ puts(nnnntt欢迎使用物资管理系统); puts(ttName:杨超 ); puts(ttNumber:1001560 ); puts(t
7、tE-mail: ); puts(ttTel: ); puts(tt ); puts(tt*杨超 ); puts(tt*.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.物资打印); pu
8、ts(ttt6.物资数据更新); puts(ttt7.退出); puts(nntt*n); puts(tt*杨超n); puts(tt*.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; /*领料函
9、数*/ 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函数提醒输入需用录
10、入物资数量,同时提醒最大数字。然后用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
11、_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 m
12、onth; 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
13、_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(
14、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:
15、); 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);用dowhil
16、e循环判定是否从新输入。 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);物资领取/*领料函数*/l
17、end()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循环判定要领取物资是否
18、存在和库中,同时判定领取量是否小于库存量。 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
19、-=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();物资数据更新
20、/*信息更改函数*/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
21、*退出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,pro
22、j.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() 输入物资名称、编号、规格、入库时间、库存最大最小和实际量。代码以下:i
23、nput(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
24、,&proi.real_s,&proi.max_s);insert() 新料入库函数,调入input()函数,将输入信息存放在原信息后面,提供是否继续选择操作。lend() 领料入库函数,输入物料信息,查找物料是否存在,假如存在则取出对应数量物料,改变对应库存信息并保留,若不存在,打印出提醒。load() 从文件中读入物资库存信息到内存,使能够对数据进行操作。代码以下:load() /*从文件读入函数*/ FILE*fp; /*定义指针*/ int k; if(fp=fopen(pro.dat,rb)=NULL) /*以只读方法打开一个二进制文件,打开失败给出提醒*/ printf(n文件打开
25、失败!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() 操作完成后返回到主
26、菜单函数。代码以下: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
27、.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) i
28、f(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()函数打印出匹
29、配物料信息。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:s
30、earch_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
31、; 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;操作
32、展示截图:开始界面:提醒语后输入信息:输入信息后选择打印结果:a编号为1000规格为xxl入库日期为.1.8库存实际量为58。以名称查询结果:以日期查询结果:以名称和规格查询结果:新料入库界面:领取a物资5个单位后,a库存实际量为53物资数据更新后,a名称改为aa,编号为1008,规格为xxx,入库日期为.1.10,库存信息也对应改变,同时上次输入新料信息也存放了进去:程序特点和个人总结: 本程序是自己劳动结果,因为是第一次学习程序语言,接触程度不深,所以编写语言很简单,全部使用是部分常见语言结构,读起来也比较轻易。同时因为是初学,所以写出程序代码也显得比较浅略,对于编程高手来说显得平淡如水,
33、这是以后需要更正地方。不过因为程序是分模块编写,看起来也比较简练,不会显得杂乱。同时有一个问题还没有处理。问题以下: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*.1.2n); printf(选择操作 1-7: bb); scanf(%d,&n); if(
34、n7) m=1;getchar(); else m=0; while(m=1);开始没有加入getchar函数,程序陷入死循环,分析了很久也没有找到原因。以后在网上搜索了一个相同代码,依葫芦画瓢加上getchar()问题才处理。不过在北区机房调试程序时,没有getchar()也没有陷入死循环。 程序中使用汉字时有时会无故失灵,不改变程序重新调试又正常运行,这也是自己需要学习一点。使用说明:本程序交互性很强,在每次输入数据时全部有提醒,所以完全能够在程序中操作自如。但需要注意一点是,输入数据时,一定要确保和提醒类型相同,不然将出现无法预料结果。以下:按日期查询数据时输入日期为we时,出现结果就显得莫名其妙。