《高级语言程序设计》课程设计建筑工地信息管理系统.doc
高级语言程序设计三峡大学理学院10级光信息科学与技术专业高级语言程序设计课程设计说明书 设计题目:建筑工地信息管理系统 班 级:光信 学 号: 姓 名: 指导老师: 完成日期:2011/11/20前言课程设计目的高级语言程序设计课程设计是电子信息、光信息专业以及物理学专业集中实践性环节之一,是学习完高级语言程序设计课程后进行的一次全面的综合练习,其目的在于加深对程序设计基本知识的理解,掌握使用C语言进行模块化软件设计的基本方法,提高通过编写程序解决实际问题的能力,为今后从事设计工作和后续各种编程课程的学习打好基础。1、 题目要求设计:“建筑工地信息管理系统”(1)主函数建立四个文件,输出提示用户操作的信息,选择操作文件:R销售商-配件-建筑工地,B建筑工地,F配件,S销售商,空格键查询。(2)数据输入模块 写数据到相应文件中。 (3)数据插入模块 采用追加的方式写数据到文件。 (4)数据删除模块 通过菜单选择相应的文件后,打开该文件,从文件中读一条记录,判断是否要删除,如 果是,则舍弃;否则重新写入文件,读下一条记录。 (5)数据更新模块 与数据删除模块类似,只是判断所读的纪录是否要更新,如果是,则把更新后的纪录写 入文件,否则直接写入文件。 (6)按空格键进入查询操作 通过菜单选择查询零件-供应商或者项目-供应商。例如选择查询零件-供应商。其基本流程如下: 打开销售商-配件-建筑工地文件; While(文件未结束) 读一条记录,得到销售商号码和配件号; 在销售商文件中查找该销售商号码,得到该销售商所在城市; 在配件文件中查找配件号,得到该配件的产地; 如果销售商所在城市与配件的产地相同,则输出销售商号码和配件号码; 查询项目-供应商记录对的操作类似,只需把配件号改为工地号即可。 2、分析 1、需求分析:信息采用文件存储,因而要提供文件的输入输出操作;要插入数据,因而要提供数据的 添加操作; 要实现数据的删除、 更新和查询, 因而要提供文件记录的删除、 修改和查找操作; 另外要提供键盘式选择菜单以实现功能选择。 2、总体设计:整个系统可以被设计为数据输入模块、数据添加模块、数据删除模块、数据查询并修改模块、配对模块。 建筑工地信息管理系统数据输入模块数 据 添 加 模 块删除模块查询修改模块 查 找 配对 模块 功能 选 择 菜 单 图1 系统功能模块图 4、详细设计一、主函数【分析】 主函数一般设计得比较简便,只提供输入、处理和输出部分的函数调用。其中各功能模块用菜单方式选择。void menu()f1()f11() ··· ··· dodo··· switch(c)switch(c) case 1:f1();break; case 1:f11();break; case 2:f2();break; case 2:f12();break; case 3:f2();break; case 3:f13();break; case 4:f2();break; case 4:f14();break;case 5:exit(0); case 5:back=0;break; default:break; default:break; while(1); while(1); ··· ··· 图(2) 【程序】/*主菜单*/ void menu() int w; do system("cls"); printf("tt*MENU*nn"); printf("tttt1.输入n");/*输入*/ printf("tttt2.删除n");/*删除*/ printf("tttt3.查找与修改n");/*查找与修改*/ printf("tttt4.配对n");/*查找配对*/ printf("tttt5.添加n"); printf("tttt6.退出"); printf("nntt*n"); printf("Choose your number (1-6): bb"); scanf("%d",&w); switch(w) case 1:enter();break; case 2:Delete();break; case 3:search();break; case 4:search2();break; case 5:add();break; case 6:exit(0); default:break; while(1); void main()system("cls");system("color 0a9");start();system("PAUSE"); menu();二、各功能模块设计(1)数据输入模块【分析】 数据信息存放在文件中,用结构体存放,方便数据输入与数据的保存。另外,输入模块中建立副菜单,用以输入四个文件的信息选项。【程序】(以输入销售商结构体信息为例)/*数据输入模块*/ void SEL_enter () system("cls");int j; char c2; FILE *fp; if(fp=fopen("data4.txt","w")=NULL) printf("Can not open the file!n"); exit(0); for(j=0;j<i;j+) fwrite(&selj,sizeof(struct seller),1,fp); while(1) printf("n输入销售商号:"); scanf("%s",seli.num); printf("n输入销售商名:"); scanf("%s",seli.name); printf("n输入销售商所在城市:"); scanf("%s",seli.city); if(fwrite(&seli+,sizeof(struct seller),1,fp)!=1) printf("nFile write errorn"); else printf("Successful! -n"); printf("是否继续?y/n: bb"); scanf("%s",c); if(strcmp(c,"n")=0|strcmp(c,"N")=0)break; fclose(fp);system("PAUSE"); ······void enter() int m,back; do system("cls"); printf("tt*MENU*nn"); printf("t以下符号:S-项目、B-建筑工地、P-配件、SEL-销售商n"); printf("tttt1.输入数据到Sn"); printf("tttt2.输入数据到Bn"); printf("tttt3.输入数据到Pn"); /*输入菜单*/ printf("tttt4.输入数据到SELn"); printf("tttt5.返回"); printf("nntt *n"); printf("请选择(1-5): bb"); scanf("%d",&m); switch(m) case 1:sal_enter();break; case 2:build_enter();break; case 3:pj_enter();break; case 4:SEL_enter();break; case 5:back=0;break; default:break; if(back=0)break; while(1); (2)删除模块【分析】 建立副菜单,选择要删除的是哪个文件中的信息,输入相应的信息,找到数据将其删除。一般的做法是将数据从文件中删除,删除位置后面的记录往前移。模块如: 开始输入要删除的数据是否找到?删除数据显示成功显示没有找到Y是否继续?是否图(3) 删除模块流程图【程序】(以删除销售商结构体信息为例)/*删除模块*/ void SEL_delete() system("cls");int j,v,flag=0; char a5,c2; FILE *fp; if(fp=fopen("data4.txt","r")=NULL) printf("n打开文件失败!n"); exit(0);do printf("请输入号码:"); scanf("%s",a); for(j=0;j<100;j+) if(fread(&selj,sizeof(struct seller),1,fp)!=1) break; fclose(fp); fp=fopen("data4.txt","w"); v=j; for(j=0;j<v;j+) if(strcmp(selj.num,a)=0) printf("n销售商号码,销售商名字,城市: n"); printf("%s %s %s",selj.num,selj.name,selj.city); for(i=j;i<v;i+) seli=seli+1; printf("Successful! -n"); flag=1; if(flag=0)printf("Cannot find the data!n"); printf("是否继续y/n: bb"); scanf("%s",c); if(strcmp(c,"n")=0|strcmp(c,"N")=0)break;while(1);for(j=0;j<i;j+)fwrite(&selj,sizeof(struct seller),1,fp); fclose(fp);system("PAUSE");void Delete() int m,back; do system("cls"); printf("tt*MENU*nn"); printf("t以下符号:S-项目、B-建筑工地、P-配件、SEL-销售商n"); printf("tttt1.删除数据到Sn"); printf("tttt2.删除数据到Bn"); printf("tttt3.删除数据到Pn"); /*删除菜单*/ printf("tttt4.删除数据到SELn"); printf("tttt5.返回"); printf("nntt *n"); printf("请选择(1-5): bb"); scanf("%d",&m); switch(m) case 1:sal_delete();break; case 2:build_delete();break; case 3:pj_delete();break; case 4:SEL_delete();break; case 5:back=0;break; default:break; if(back=0)break; while(1); (3)查找与修改模块【分析】 选择查找方式,输入相应的数据然后找出对应的数据。模块流程图:开始输入查找的方式:1)项目号;2)工地号;3)配件号;4)销售商号是否找到?显示找到的记录提示没找到Y返回主菜单Y是否继续查找?返回副菜单是否修改? 图(4) 查找修改模块流程图【程序】(以查找修改销售商结构体信息为例)/*查找与修改模块*/ void SEL_search()system("cls");char a5,c2;int j,k=0,flag=0;struct seller p1100,p2100;FILE *fp;printf("n请输入要查找的销售商号:");scanf("%s",a);if(fp=fopen("data4.txt","r")=NULL)printf("n打开文件失败!n"); exit(0);for(j=0;!feof(fp);j+)fread(&p1j,sizeof(struct seller),1,fp);if(strcmp(p1j.num,a)=0) printf("n销售商号:%sn",p1j.num); printf("销售商名:%sn",p1j.name); printf("所在城市名:%sn",p1j.city); printf("-n"); flag=1;printf("n是否修改y/n: bb"); scanf("%s",c); if(strcmp(c,"y")=0|strcmp(c,"Y")=0) printf("n销售商号:");scanf("%s",p2k.num);strcpy(p1j.num,p2k.num);printf("n销售商名:");scanf("%s",p2k.name);strcpy(p1j.name,p2k.name);printf("n所在城市名:");scanf("%s",p2k.city);strcpy(p1j.city,p2k.city);k+;printf("successful! -n"); /else continue;fclose(fp); fp=fopen("data4.txt","w");for(k=0;k<j;k+) fwrite(&p1k,sizeof(struct seller),1,fp);if(flag=0)printf("没有要找的数据!n");fclose(fp);system("PAUSE");······void search() int back,w; do system("cls"); printf("tt*MENU*nn"); printf("tttt1.by项目号n"); printf("tttt2.by工地号n"); printf("tttt3.by配件号n"); /*查找与修改菜单*/ printf("tttt4.by销售商号n"); printf("tttt5. 返回"); printf("nntt *n"); printf("请选择(1-5): bb"); scanf("%d",&w); switch(w) case 1:sal_search();break; case 2:build_search();break; case 3:pj_search();break; case 4:SEL_search();break; case 5:back=0;break; default:break; if(back=0)break; while(1); (4)查找配对模块【分析】 功能跟查找大致相同,输入要配对的相应信息,找出要的信息。开始方式:1)配件-供应商;2)项目-供应商是否找到?显示找到的记录提示没找到N 图(5) 查找配对模块流程图【程序】(以查找配件供应商信息为例)/*查找配对模块*/void find1()system("cls");int m=0,n,k;int flag=0;FILE *fp,*fp1,*fp2;if(fp=fopen("data1.txt","r")=NULL) printf("Can not open the file!n"); exit(0); if(fp1=fopen("data3.txt","r")=NULL) printf("Can not open the file!n"); exit(0); if(fp2=fopen("data4.txt","r")=NULL) printf("Can not open the file!n"); exit(0); dofread(&salm,sizeof(struct sale),1,fp);for(n=0;!feof(fp1);n+)fread(&pjn,sizeof(struct peijian),1,fp1);if(strcmp(pjn.num,salm.num2)=0)break;for(k=0;!feof(fp2);k+)fread(&selk,sizeof(struct seller),1,fp2);if(strcmp(selk.num,salm.num1)=0)break;if(strcmp(selk.city,pjn.area)=0)printf("销售商号码:%sn",selk.num);printf("配件号:%sn",pjn.num);flag=1;m+;while(!feof(fp);if(flag=0)printf("没有配对项!n");fclose(fp1);fclose(fp2);fclose(fp);system("PAUSE"); 5、上机操作 (1) 主菜单函数 图(6) 主菜单(2)数据输入模块 图(7) 输入副菜单(3) 删除模块 图(8) 删除模块(4) 查找模块图(9) 查找修改模块(5)添加模块图(10) 添加模块(6)查找配对模块 图13 查找配对模块后记这次课程设计,让我对C语言编程有了更进一步的认识,巩固了C语言的基本功,同时体会到:做好一件事是不容易的,要找准方向并付出最大努力,才有好的收获!我原本以为计算机二级过了,编程就没多大问题了,通过这次课设,我才明白考试只是一种形式,真正能检验实力还是实践。能看懂程序并不代表会写程序,看程序和写程序之间需要很长的路要走。我觉得这次课设主要是对基本知识的综合应用,并引入模块化程序设计的思想。比如我这个建筑工地信息管理系统,主要是用do、for循环和switch结构以文件为中间平台,使各模块之间能够数据共享,而不需要传值或传地址调用,降低了模块间的耦合性。应该说这次课设是为以后学习软件技术奠基。最后需要说明的是,这个程序还没有达到理想的效果,希望各位能够提供些帮助和建议!参考文献1谭浩强.C程序设计(第二版).北京:清华大学出版社,19992王新 孙雷.C语言课程设计.北京:清华大学出版社,20093谭浩强.C程序设计(第三版).北京:清华大学出版社,2005 附录:源程序清单/*文件*data1.txtdata2.txtdata3.txtdata4.txt*/#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> /#include<iomanip>#define SPACE 0x3920#define ESC 0x011bint i=0; struct sale /*定义销售商-配件-建筑工地*/ char num15; /*销售商号码*/ char num25; /*配件号*/ char num35; /*工地号*/ int num; /*数量*/ sal100; struct building /*定义建筑工地结构体*/ char num5; /*工地号*/ char name20; /*工地名*/ char city20; /*城市名*/ build100; struct peijian /*定义配件结构体*/ char num5; /*配件号*/ char name20; /*配件名*/ char color20; /*颜色*/ int weight; /*重量*/ char area20; /*产地*/ pj100; struct seller /*定义销售商结构体*/ char num5; /*销售商号码*/ char name20; /*销售商名字*/ char city20; /*城市*/ sel100; /*数据输入模块*/ void sal_enter() system("cls"); int j; char c2; FILE *fp; if(fp=fopen("data1.txt","w")=NULL) printf("Can not open the file!n"); exit(0); for(j=0;j<i;j+) fwrite(&salj,sizeof(struct sale),1,fp); while(1) printf("n输入销售商号码:"); scanf("%s",sali.num1); printf("n输入配件号码:"); scanf("%s",sali.num2); printf("n输入工地号码:"); scanf("%s",sali.num3); printf("n输入数量:"); scanf("%d",&sali.num); if(fwrite(&sali+,sizeof(struct sale),1,fp)!=1) printf("nFile write errorn"); else printf("Successful! -n"); printf("是否继续?y/n: bb"); scanf("%s",c); if(strcmp(c,"n")=0|strcmp(c,"N")=0)break; fclose(fp);system("PAUSE"); void build_enter() system("cls");int j; char c2; FILE *fp; if(fp=fopen("data2.txt","w")=NULL) printf("Can not open the file!n"); exit(0); for(j=0;j<i;j+) fwrite(&buildj,sizeof(struct building),1,fp); while(1) printf("n输入工地号:"); scanf("%s",buildi.num); printf("n输入工地名:"); scanf("%s",buildi.name); printf("n输入工地城市:"); scanf("%s",buildi.city); if(fwrite(&buildi+,sizeof(struct building),1,fp)!=1) printf("nFile write errorn"); else printf("Successful! -n"); printf("是否继续?y/n: bb"); scanf("%s",c); if(strcmp(c,"n")=0|strcmp(c,"N")=0)break; fclose(fp);system("PAUSE"); void pj_enter() system("cls");int j; char c2; FILE *fp; if(fp=fopen("data3.txt","w")=NULL) printf("Can not open the file!n"); exit(0); for(j=0;j<i;j+) fwrite(&pjj,sizeof(struct peijian),1,fp); while(1) printf("n输入配件号:"); scanf("%s",pji.num); printf("n输入配件名:"); scanf("%s",pji.name); printf("n输入配件颜色:"); scanf("%s",pji.color); printf("n输入配件重量:"); scanf("%d",&pji.weight); printf("n输入配件产地:"); scanf("%s",pji.area); if(fwrite(&pji+,sizeof(struct peijian),1,fp)!=1) printf("nFile write errorn"); else printf("Successful! -n"); printf("是否继续?y/n: bb"); scanf("%s",c); if(strcmp(c,"n")=0|strcmp(c,"N")=0)break; fclose(fp);system("PAUSE"); void SEL_enter () system("cls");int j; char c2; FILE *fp; if(fp=fopen("data4.txt","w")=NULL) printf("Can not open the file!n"); exit(0); for(j=0;j<i;j+) fwrite(&selj,sizeof(struct seller),1,fp); while(1) printf("n输入销售商号:"); scanf("%s",seli.num); printf("n输入销售商名:"); scanf("%s",seli.name); printf("n输入销售商所在城市:"); scanf("%s",seli.city); if(fwrite(&seli+,sizeof(struct seller),1,fp)!=1) printf("nFile write errorn"); else printf("Successful! -n"); printf("是否继续?y/n: bb"); scanf("%s",c); if(strcmp(c,"n")=0|strcmp(c,"N")=0)break; fclose(fp);system("PAUSE"); void enter() int m,back; do system("cls"); printf("tt*MENU*nn"); printf("t以下符号:S-项目、B-建筑工地、P-配件、SEL-销售商n"); printf("tttt1.输入数据到Sn"); printf("tttt2.输入数据到Bn"); printf("tttt3.输入数据到Pn"); /*输入菜单*/ printf("tttt4.输入数据到SELn"); printf("tttt5.返回"); printf("nntt *n"); printf("请选择(1-5): bb"); scanf("%d",&m); switch(m) case 1:sal_enter();break; case 2:build_enter();break; case 3:pj_enter();break; case 4:SEL_enter();break; case 5:back=0;break; default:break; if(back=0)break; while(1)