资源描述
建筑工地信息管理系统课程设计报告
62
2020年5月29日
文档仅供参考
C语言课程设计
名称:建筑工地信息管理系统
学院:工程学院
班级:055071-30
姓名:文富奎
学号: 1003889
指导老师:刘文中
前言
课程设计目的:C语言编程实践是学习C语言的一个重要环节,为提高学生的程序设计能力,经过课堂和上机实践使学生的程序设计能力有一个上升的台阶。经过前四单元的温故而知新、庖丁解牛、举一反三、熟能生巧等过程的练习之后能够解决一些简单的实际问题。
1、 题目要求
设计:”建筑工地信息管理系统”
建立如下4个文件(括号内为文件中每条记录的字段内容):
(1) 销售商-配件-建筑工地 (销售商号码,配件号,工地号,数量)
(2) 建筑工地 (工地号,名字,城市)
(3) 配件 (配件号,配件名,颜色,重量,产地)
(4) 销售商 (号码,名字,状态,城市)
功能:
(1) 首先建立文件,然后插入数据,并进行删除、更新操作,最后进行查询操作。
(2) 查询与供应商所在城市相同的零件——供应商,项目——供应商记录对。
2、分析
根据题目要求,建立文件,应选择结构体数组来存放数据,再定义一个全局变量和文件指针进行程序的运行,然后把数据信息存入文件中,因此要提供结构体和文件的输入输出等操作;在程序中要进行数据的插入、删除、更新、查询等操作,因此需要建立相应的模块来实现,为简便起见,还应建立一个主菜单,在每个模块中建立相应的副菜单;另外,还要提供键盘式选择菜单来实现选择功能,使程序在运行时达到要求。
3、总体设计
根据题目要求,能够将系统分为:
1) 插入数据模块;
2) 删除模块;
3) 查询模块;
4) 查找配对;
5) 功能选择菜
建筑工地信息管理系统
查
找
配对
模块
删
除
模
块
查
询
模
块
数
据
输
入
模
块
功能
选
择
菜
单
图1 系统功能模块图
4、详细设计
一、主函数
【分析】 主函数一般设计得比较简便,只提供输入、处理和输出部分的函数调用。其中各功能模块用菜单方式选择。其流程图:
开始
显示一系列功能选择
输入n,判断w
是否是0到4?
根据n值调用各
功能模块函数
结束
N
图2 主函数流程图
【程序】
/************************主菜单*********************************/
void menu()
{
int n,w; /*变量n保存选择菜单数字,w判断输入的数字是否在功能菜单对应数字范围内*/
do
{ puts("\t\t*************建筑工地信息管理****************\n\n");
puts("姓名:文富奎");
puts("学号: 1003889");
puts("班学号:055071-30");
puts("\t\t****************MENU*******************\n\n");
puts("\t\t\t\t1.输入");/*输入*/
puts("\t\t\t\t2.删除");/*删除*/
puts("\t\t\t\t3.查找");/*查找*/
puts("\t\t\t\t4.配对");/*查找配对*/
puts("\t\t\t\t5.Exit");
puts("\n\n\t\t**************************************\n");
printf("Choose your number (1-5):[ ]\b\b");
scanf("%d",&n);
if(n<1||n>5)
{ w=1;
getchar();
} else w=0;
}
while(w==1);
switch(n)
{ case 1:enter();break;
case 2:delete();break;
case 3:search();break;
case 4:search2();break;
case 5:exit(0);
}
}
main()
{
menu();
}
二、各功能模块设计
(1)数据输入模块
【分析】 数据信息存放在文件中,用结构体存放,方便数据输入与数据的保存。另外,输入模块中建立副菜单,用以输入四个文件的信息选项。
开始
输入用户信息
是否继续进行?
结束
返回主菜单
Y
图3 数据输入模块流程图
【程序】
/*****************************数据输入模块************************************/
void sal_enter()
{ int j;
char c[2];
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(&sal[j],sizeof(struct sale),1,fp);
}
while(1)
{
printf("输入销售商号码:\n");
scanf("%d",&sal[i].num1);
printf("输入配件号码:\n");
scanf("%d",&sal[i].num2);
printf("输入工地号码:\n");
scanf("%d",&sal[i].num3);
printf("输入数量r:\n");
scanf("%d",&sal[i].num4);
if(fwrite(&sal[i++],sizeof(struct sale),1,fp)!=1)
printf("File write error\n");
else printf("Successful!\n");
printf("是否继续?( 是[y]/否[n]) \n");
scanf("%s",c);
if(strcmp(c,"n")==0)break;
}
fclose(fp);menu();
}
void build_enter()
{ int j;
char c[2];
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(&build[j],sizeof(struct building),1,fp);
}
while(1)
{
printf("输入工地号:\n");
scanf("%d",&build[i].num);
printf("输入工地名:\n");
scanf("%s",build[i].name);
printf("输入工地城市:\n");
scanf("%s",build[i].city);
if(fwrite(&build[i++],sizeof(struct building),1,fp)!=1)
printf("File write error\n");
else printf("Successful!\n");
printf("Is there any more?( Yes[y]/No[n]) \n");
scanf("%s",c);
if(strcmp(c,"n")==0)break;
}
fclose(fp);menu();
}
void pj_enter()
{int j;
char c[2];
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(&pj[j],sizeof(struct peijian),1,fp);
}
while(1)
{
printf("输入配件号:\n");
scanf("%d",&pj[i].num);
printf("输入配件名:\n");
scanf("%s",pj[i].name);
printf("输入配件颜色:\n");
scanf("%s",pj[i].color);
printf("输入配件重量:\n");
scanf("%d",&pj[i].weight);
printf("输入配件产地:\n");
scanf("%s",pj[i].area);
if(fwrite(&pj[i++],sizeof(struct peijian),1,fp)!=1)
printf("File write error\n");
else printf("Successful!\n");
printf("Is there any more?( Yes[y]/No[n]) \n");
scanf("%s",c);
if(strcmp(c,"n")==0)break;
}
fclose(fp);menu();
}
void SET_enter ()
{ int j;
char c[2];
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(&sel[j],sizeof(struct seller),1,fp);
}
while(1)
{
printf("输入销售商号:\n");
scanf("%d",&sel[i].num);
printf("输入销售商名:\n");
scanf("%s",sel[i].name);
printf("输入销售商状态:\n");
scanf("%s",sel[i].state);
printf("输入销售商所在城市:\n");
scanf("%s",sel[i].city);
if(fwrite(&sel[i++],sizeof(struct seller),1,fp)!=1)
printf("File write error\n");
else printf("Successful!\n");
printf("Is there any more?( Yes[y]/No[n]) \n");
scanf("%s",c);
if(strcmp(c,"n")==0)break;
}
fclose(fp);menu();
}
void enter()
{ int t,m;
do
{
puts("\t\t***************MENU*************\n\n");
puts("\t\t\t\t1.sal_enter new data");
puts("\t\t\t\t2.build_enter new data");
puts("\t\t\t\t3.pj_enter new data"); /***************输入菜单****************/
puts("\t\t\t\t4.SET_enter new data");
puts("\t\t\t\t5.Exit");
puts("\n\n\t\t ********************************\n");
printf("Choose the number(1-5):[ ]\b\b");
scanf("%d",&m);
if(m<1||m>5)
{ t=1;
getchar();
}
else t=0;
}
while(t==1);
switch(m)
{
case 1:sal_enter();break;
case 2:build_enter();break;
case 3:pj_enter();break;
case 4:SET_enter();break;
case 5:menu();
}
}
(2) 删除模块
【分析】 建立副菜单,选择要删除的是哪个文件中的信息,输入相应的信息,找到数据将其删除。一般的做法是将数据从文件中删除,删除位置后面的记录往前移。模块如:
开始
输入要删除
的数据
是否找到?
删除数据
显示成功
显示没有找到
Y
结束
图4 删除模块流程图
【程序】
/******************************删除模块************************************/
void sal_delete()
{int j,v;
int w;
FILE *fp;
printf("请输入要删除的销售商号码:");
scanf("%d",&w);
fp=fopen("data1.txt","rb");
for(j=0;j<100;j++)
{
if(fread(&sal[j],sizeof(struct sale),1,fp)!=1) break;
}
v=j;
for(j=0;j<v;j++)
{
if(w==sal[j].num1)
{printf("项目号,销售商号码,配件号,工地号,数量:\n");
printf("%d %d %d %d %d",sal[j].num,sal[j].num1,sal[j].num2,sal[j].num3,sal[j].num4);for(i=j;i<v;i++) sal[j]=sal[j++];printf("删除成功");
}
else printf("Cannot find the data!");
menu();
}
fclose(fp);
}
void build_delete()
{int j,v;
int w;
FILE *fp;
printf("请输入要删除的工地号:");
scanf("%d",&w);
fp=fopen("data2.txt","rb");
for(j=0;j<100;j++)
{
if(fread(&build[j],sizeof(struct building),1,fp)!=1) break;
}
v=j;
for(j=0;j<v;j++)
{
if(w==build[j].num)
{printf("工地号,工地名,城市名:\n");printf("%d %s %s",build[j].num, build[j].name,build[j].city);printf("删除成功");
}
else printf("Cannot find the data!");menu();
}
fclose(fp);
menu();
}
void pj_delete()
{int j,v;
int w;
FILE *fp;
printf("请输入要删除的配件号:");
scanf("%d",&w);
fp=fopen("data3.txt","rb");
for(j=0;j<100;j++)
{
if(fread(&pj[j],sizeof(struct peijian),1,fp)!=1) break;
}
v=j;
for(j=0;j<v;j++)
{
if(w==pj[j].num)
{printf(" 配件号,配件名,颜色,重量,产地:\n");printf("%d %s %s %d %s",pj[j].num,pj[j].name,pj[j].color,pj[j].weight,pj[j].area);printf("删除成功");
}
else printf("Cannot find the data!");menu();
}
fclose(fp);
menu();
}
void SET_delete ()
{int j,v,c;
int w;
FILE *fp;
printf("请输入号码:");
scanf("%d",&w);
fp=fopen("data4.txt","rb");
for(j=0;j<100;j++)
{
if(fread(&sel[j],sizeof(struct seller),1,fp)!=1) break;
}
v=j;
for(j=0;j<v;j++)
{
if(w==sel[j].num)
{printf(" 销售商号码,销售商名字,状态,城市: \n");printf("%d %s %s %s",sel[j].num,sel[j].name,sel[j].state,sel[j].city);printf("删除成功");
}
else printf("Cannot find the data!");menu();
}
fclose(fp);
menu();
}
void delete()
{ int t,m;
do
{
puts("\t\t***************MENU*************\n\n");
puts("\t\t\t\t1.sal_delete new data");
puts("\t\t\t\t2.build_delete new data");
puts("\t\t\t\t3.pj_delete new data"); /*********删除菜单****************/
puts("\t\t\t\t4.SET_delete new data");
puts("\t\t\t\t5.Exit");
puts("\n\n\t\t ********************************\n");
printf("Choose the number(1-5):[ ]\b\b");
scanf("%d",&m);
if(m<1||m>5)
{
t=1;
getchar();
}
else t=0;
}
while(t==1);
switch(m)
{
case 1:sal_delete();break;
case 2:build_delete();break;
case 3:pj_delete();break;
case 4:SET_delete ();break;
case 5:menu();
}
}
(3) 查找模块
【分析】 选择查找方式,输入相应的数据然后找出对应的数据。模块流程图:
开始
输入查找的方式:1)项目号;2)工地号;3)配件号;4)销售商号
是否找到?
显示找到的记录
提示没找到
Y
结束
Y
是否继续查找?
返回主菜单
图5 查找模块流程图
【程序】
/********************************查找模块***********************************/
void search()
{
int flag,j,x;
int w,v,z,y;
FILE *fp;
printf("1.By 项目号\n");
printf("2.By 工地号\n");
printf("3.By 配件号\n");
printf("4.By 销售商号\n");
printf("请选择项:\n");
scanf("%d",&x);
if(x==3)
{
flag=0;
printf("Please input the 配件号:");
scanf("%d",&w);
fp=fopen("data3.txt","rb");
for(j=0;j<100;j++)
{
if(fread(&pj[j],sizeof(struct peijian),1,fp)!=1) break;
if(pj[j].num==w)
{
printf("配件号:%d\n",pj[j].num);
printf("配件名:%s\n",pj[j].name);
printf("配件颜色:%s\n",pj[j].color);
printf("配件重量:%d\n",pj[j].weight);
printf("配件产地:%s\n",pj[j].area);
printf("---------------------------------\n");
flag=1;
}
}
if(flag==0)
printf("Cannot find the data!\n");
fclose(fp); menu();
}
if(x==4)
{
flag=0;
printf("请输入销售商号:");
scanf("%d",&z);
fp=fopen("data4.txt","rb");
for(j=0;j<100;j++)
{
if(fread(&sel[j],sizeof(struct seller),1,fp)!=1) break;
if(pj[j].num==y)
{
printf("销售商号:%d\n",sel[j].num);
printf("销售商名:%s\n",sel[j].name);
printf("所在城市名:%s\n",sel[j].city);
printf("---------------------------------\n");
flag=1;
}
}
if(flag==0)
printf("Cannot find the data!\n");
fclose(fp); menu();
}
if(x==2)
{
flag=0;
printf("请输入建筑工地号:");
scanf("%d",&z);
fp=fopen("data2.txt","rb");
for(j=0;j<100;j++)
{
if(fread(&build[j],sizeof(struct building),1,fp)!=1) break;
if(pj[j].num==z)
{
printf("建筑工地号:%d\n",build[j].num);
printf("建筑工地名:%s\n",build[j].name);
printf("所在城市名:%s\n",build[j].city);
printf("---------------------------------\n");
flag=1;
}
}
if(flag==0)
printf("Cannot find the data!\n");
fclose(fp); menu();
}
if(x==1)
{
flag=0;
printf("Please input the 项目号:");
scanf("%d",&v);
fp=fopen("data1.txt","rb");
for(j=0;j<100;j++)
{
if(fread(&pj[j],sizeof(struct peijian),1,fp)!=1) break;
if(pj[j].num==v)
{
printf("seller number:%d\n",sal[j].num1);
printf("peijian number:%d\n",sal[j].num2);
printf("building number:%d\n",sal[j].num3);
printf("number:%d\n",sal[j].num4);
printf("---------------------------------\n");
flag=1;
}
}
if(flag==0)
printf("Cannot find the data!\n");
fclose(fp);menu();
}
else printf("Error!\n");
}
(4) 查找配对模块
【分析】 功能跟查找大致相同,输入要配正确相应信息,找出要的信息。
是否继续查找?
开始
输入要配正确方式:1)配件号;2)销售商号码
是否找到?
显示找到的记录
提示没找到
N
Y
结束
N
图6 查找配对模块流程图
【程序】
/********************************查找配对模块*****************************/
void search2()
{
int flag,j,x;
int w;
FILE *fp;
printf("1.By 配件号\n");
printf("2.By 销售商号\n");
printf("请选择项:\n");
scanf("%d",&x);
if(x==1)
{
FILE *fp;
int i;
printf("Please input the 配件号:");
scanf("%d",&w);
if((fp=fopen("data3.txt","r"))==NULL)
{printf("Cannot find the data!\n");
fclose(fp);menu();
}
for(i=0;!feof(fp);i++)
fscanf(fp,"%d%s%s",pj[i].num,&pj[i].name,&pj[i].area);
fclose(fp);
if((fp=fopen("data4.txt","r"))==NULL)
{printf("Cannot find the data!\n");
fclose(fp);menu();
}
for(i=0;!feof(fp);i++)
fscanf(fp,"%d%s%s",sel[i].num,&sel[i].name,&sel[i].city);
fclose(fp);
if(pj[i].num==w&&strcmp(pj[i].area,"sel[i].city")==0)
{ printf("配件号:%d\n",pj[j].num);
printf("配件名:%s\n",pj[j].name);
printf("销售商号:%d\n",pj[j].num);
printf("销售商名:%s\n",pj[j].area);
printf("---------------------------------\n");
flag=1;
}
}
if(flag==0)
printf("Cannot find the data!\n");
fclose(fp); menu();
}
5、上机操作
(1) 主菜单函数
图7 主菜单
(2) 数据输入模块
图8 输入副菜单
图9 输入数据
(3) 删除模块
图10 删除模块
(4) 查找模块
图11 查找模块(1)
图12 查找模块 (2)
(5)查找配对模块
图13 查找配对模块
后记
此次课程设计的学习,让我的在计算机方面的认识有了更为广阔的了解。其中在学习过程中遇到了许多麻烦,很多都让人挺郁闷的,幸亏的是我没有放弃。以前在课堂上学的C语言用到上机上来,许多问题都反映了出来,得以让我的认知升级。课程设计的学习,提高了我运用了计算机能力以及培养了我运用结构化程序设计的思想和方法,初步掌握开发一个小型实用系统的基本方法,学会调试较长的程序,学会用流程图表示算法,进一步掌握和提高利用C语言进行程序设计的能力。
程序设计的过程,实际上是确定解决问题的详细步骤,而这个步骤一般称为流程,设计好如何进行程序的细编在程序量很大的情况下解决问题是很重要的。一个大的程序,一般是经过很多步才完成,不断的进行程序的调试来完成它。
现在程序基本上是完成了,里面或多或少的存在问题。其中在对数据进行输入的时候,不太方便,能够设计一个程序使在完成一个的输入后返回副菜单而不是主菜单;删除模块能够加上一些程序使删除的时候有选择性而不是直接删除,没有后悔的余地;最重要的是现在查找配对还有一点不完善,没有起到应有的作用。总的来说,这次课程设计还是比较成功的,虽然不是达到很完美。
附录:源程序清单
/*
data1.txt/**********文件*************/
data2.txt
data3.txt
data4.txt
*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
int i=0;
struct sale /*定义销售商-配件-建筑工地*/
{int num;/*项目号*/
int num1; /*销售商号码*/
int num2; /*配件号*/
int num3; /*工地号*/
int num4; /*数量*/
}sal[100];
struct building /*定义建筑工地结构体*/
{int num; /*工地号*/
char name[20]; /*工地名*/
char city[20]; /*城市名*/
}build[100];
struct peijian /*定义配件结构体*/
{int num; /*配件号*/
char name[20]; /*配件名*/
char color[20]; /*颜色*/
int weight; /*重量*/
char area[20]; /*产地*/
}pj[100];
struct seller /*定义销售商结构体*/
{int num ; /*销售商号码*/
char name[20]; /*销售商名字*/
char state[20]; /*状态*/
char city[20]; /*城市*/
}sel[100];
void menu();
/*****************************数据输入模块************************************/
void sal_enter()
{ int j;
char c[2];
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(&sal[j],sizeof(struct sale),1,fp);
}
while(1)
{
printf("输入销售商号码:\n");
scanf("%d",&sal[i].num1);
printf("输入配件号码:\n");
scanf("%d",&sal[i].num2);
printf("输入工地号码:\n");
scanf("%d",&sal[i].num3);
printf("输入数量r:\n");
scanf("%d",&sal[i].num4);
if(fwrite(&sal[i++],sizeof(struct sale),1,fp)!=1)
printf("File write error\n");
else printf("Successful!\n");
printf("是否继续?( 是[y]/否[n]) \n");
scanf("%s",c);
if(strcmp(c,"n")==0)break;
}
fclose(fp);menu();
}
void build_enter()
{ int j;
char c[2];
FILE *fp;
if((fp=fopen("data2.txt","w"))==NULL)
{
printf("Can not open the file!\n
展开阅读全文