一图书信息管理系统.docx

上传人:b****5 文档编号:11761312 上传时间:2023-03-31 格式:DOCX 页数:39 大小:168.10KB
下载 相关 举报
一图书信息管理系统.docx_第1页
第1页 / 共39页
一图书信息管理系统.docx_第2页
第2页 / 共39页
一图书信息管理系统.docx_第3页
第3页 / 共39页
一图书信息管理系统.docx_第4页
第4页 / 共39页
一图书信息管理系统.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

一图书信息管理系统.docx

《一图书信息管理系统.docx》由会员分享,可在线阅读,更多相关《一图书信息管理系统.docx(39页珍藏版)》请在冰豆网上搜索。

一图书信息管理系统.docx

一图书信息管理系统

一图书信息管理系统

1.1题目要求

●图书信息包括:

登录号、书名、作者名、分类号、出版单位、出版时间、价格等。

●试设计一图书信息管理系统,使之能提供以下功能:

a)系统以菜单方式工作

b)图书信息录入功能(图书信息用文件保存)--输入

c)图书信息浏览功能--输出

d)查询和排序功能:

(至少一种查询方式)--算法

(1)按书名查询

(2)按作者名查询

e)图书信息的删除与修改(可选项)v

[提示]建立职工信息结构体,结构体成员包括职工号、姓名、性别、年龄、学历、工资、住址、电话。

1.2需求分析

根据题目要求,要求对图书信息进行输入、输出等操作;在程序中需要浏览图书的信息,应提供显示、查找、浏览、插入、修改等操作;另外还应提供键盘式选择菜单实现功能选择。

1.3总体设计

根据需求分析,可以对这个系统的设计分为以下几个模块:

图1.3系统功能模块图

1.4详细设计

1.4.1主函数

主函数一般设计得比较简洁,只提供输入,处理和输出部分的函数调用。

其中各功能模块用菜单方式选择。

[流程图]:

 

显示各功能选项

图1.4.1主函数流程图

[程序]:

/*****************主函数**********************/

main()

{menu();

}

/*****************menu函数********************/

voidmenu()

{intn,w1;/*变量n保存选择菜单数字,w1判断输入的数字是否在功能菜单对应数字范围*/

do

{

puts("\t\t*****************menu****************\n\n");

puts("\t\t\t\t1.Enternewdata");

puts("\t\t\t\t2.Browseall");

puts("\t\t\t\t3.Search");

puts("\t\t\t\t4.add");

puts("\t\t\t\t5.Exit");

puts("\n\n\t\t***********************************\n");

printf("Choiceyournumber(1-5):

[]\b\b");

scanf("%d",&n);

if(n<1||n>5)/*对选择的数字作出判断,是否在菜单功能数字范围内*/

{w1=1;getchar();}

elsew1=0;

}while(w1==1);

switch(n)/*根据输入的数字,进入到相应的操作模块中*/

{case1:

enter();break;/*输入模块*/

case2:

browse();break;/*浏览模块*/

case3:

search();break;/*查找模块,其中包括按不同类别进行查找的多个子模块*/

case4:

add();break;/*插入模块*/

case5:

exit(0);/*退出*/

}

}

注:

menu函数能提供菜单方式选择功能,可以根据用户需要进入到所想要的操作模块中,此外把menu函数独立出来,可以方便随时对它进行调用,容易返回到系统界面。

用结构体来存放职工信息:

/********************结构体*******************/

structworker

{

charnumber[11];

charname[20];

charsex[20];

charadress[20];

charxueli[20];

chartelephone[20];

charage[20];

charsalary[20];

}wor[N];

/*wor[N]中每个数组元素对应一个职工*/

其中可以根据宏定义#defineN随时对N的值进行调整,扩大信息的储存量。

1.4.2各功能模块设计

(1)输入模块

[需求分析]对信息进行输入。

[流程图]:

图1输入模块流程图

 

[程序]:

/********************输入模块*******************/

voidenter()/*输入函数*/

{

inti,n;

printf("Howmanyworkers(0-%d):

",N-1);

scanf("%d",&n);/*输入记录的个数,赋值给n*/

printf("\nEnterdatanow\n\n");

for(i=0;i

{printf("\nInput%dthworkerrecord.\n",i+1);

input(i);/*调用单个输入函数*/

}

if(i!

=0)save(n);/*调用保存函数*/

printf_back();/*一个任务结束时让用户选择是浏览还是返回*/

}

(2)浏览模块

[需求分析]该模块的功能是显示所有职工记录信息。

[流程图]

显示职工记录(10个一屏)

 

按任意键显示下一屏

 

按任意键返回主菜单

 

图2浏览模块流程图

[程序]:

/****************浏览(全部)模块***************/

browse()/*浏览(全部模块)*/

{

inti,j,n;

n=load();/*调用加载函数,并计算可以记录的个数*/

printf_face();/*调出显示数据结构项目函数*/

for(i=0;i

{

if((i!

=0)&&(i%10==0))/*判断i值能否整除10,每10行一屏显示*/

{

printf("\n\nPassanykeytocontinue...");

getchar();

puts("\n\n");

}

printf_one(i);/*调用显示一个记录的函数*/

}

printf("\tThereare%drecord.\n",n);/*提示用户储存信息数量*/

printf("\nPassanykeytoback...");

getch();/*按任意键*/

menu();/*返回主菜单*/

}

(3)查找模块

[流程图]:

图3查找模块流程图

[程序]:

/***************查找模块***************/

search()/*查找模块*/

{

intc,w1;

do/*do-while循环语句用来判断用户的选择是否在程序规定之内*/

{

puts("\nsearchby=>\n\n1).number2).xueli3).cancelandback");

printf("Whichyouneeded?

:

[]\b\b");

scanf("%d",&c);

if(c>3||c<1)/*对选择的数字作出判断*/

{

puts("\nchoiceerror!

pleaseagain!

");

getchar();}

}

while(c>3||c<1);

{

switch(c)/*switch语句提供按不同类别进行查找功能*/

{

case1:

search1();break;/*按职工号进行查找*/

case2:

search2();break;/*按姓名进行查找*/

case3:

menu();break;/*返回主菜单*/

}

}

}

/***************按职工号查找模块***************/

[流程图]:

 

按职工号查找模块

用户作出选择,输入一整型数值

1,2,还是3

修改

返回主菜单

继续查找

 

图4按职工号查找模块流程图

[程序]:

search1()

{

inti,n,k,w1=1,w2,w3,w4;

structworkers;/*定义结构体变量s,用以储存输入的number的值,便于进行比较*/

n=load();/*加载将要记录的个数*/

do/*该do-while循环语句判断是否继续执行该函数*/

{

do/*该do-while循环语句判断是否找到要查找的对象*/

{

k=-1;

printf("\n\nEnternumberthatyouwanttosearch!

number:

");

scanf("%s",s.number);

printf_face();/*调出显示数据结构项目函数*/

for(i=0;i

同的职工号*/

if(strcmp(s.number,wor[i].number)==0)/*原数据信息中找到与输入职工号相

同的职工号*/

{k=i;

printf_one(k);break;

}

if(k==-1)/*原数据信息中没有找到与输入职工号相同的职工号*/

{

printf("\n\nNoexit!

please");

printf("\n\nAreyouagain?

\n\t1).again2).Noandback[]\b\b");

scanf("%d",&w1);

if(w1==2)menu();/*返回主菜单*/

}

}while(k==-1&&w1==1);/*在没有找到且想再次查找的情况下继续进行循环*/

w4=0;w3=0;

if(k!

=-1)/*在查找到的情况下*/

{

printf("\n\nWhatdoyouwanttodo?

\n\t1).Searchanother2).Modify3).Backmenu[]\b\b");

scanf("%d",&w2);

switch(w2)

{case1:

search1();break;/*继续按照职工号查找其他对象*/

case2:

w3=modify_data(k,n);break;/*对查找到的对象进行修改*/

case3:

menu();break;/*返回主菜单*/

}

}

}while(w2==1);

menu();/*返回主菜单*/

}

/***************按学历查找模块***************/

 

[流程图]

 

按职工学历查找模块

用户作出选择,输入一整型数值

1,2,还是3

 

修改

返回主菜单

继续查找

图5按职工学历查找模块流程图

[程序]:

search2()

{inti,n,k,w1=1,w2,w3,w4;

structworkers;/*定义结构体变量s,用以储存输入的xueli的值,便于进行比较*/

n=load();/*加载将要记录的个数*/

do/*该do-while循环语句判断是否继续执行该函数*/

{

do/*该do-while循环语句判断是否找到要查找的对象*/

{k=-1;

printf("\n\nEnterxuelithatyouwanttosearch!

xueli:

");

scanf("%s",s.xueli);

printf_face();/*调出显示数据结构项目函数*/

for(i=0;i

职工*/

if(strcmp(s.xueli,wor[i].xueli)==0)/*原数据信息中找到与输入职工学历相同的职工*/

{k=i;

printf_one(k);break;

}

if(k==-1)/*原数据信息中没有找到与输入职工学历相同的职工*/

{printf("\n\nNoexit!

please");

printf("\n\nAreyouagain?

\n\t1).again2).Noandback[]\b\b");

scanf("%d",&w1);

if(w1==2)menu();/*返回主菜单*/

}

}

while(k==-1&&w1==1);/*在没有找到且想再次查找的情况下继续进行循环*/

w4=0;w3=0;

if(k!

=-1)/*在查找到的情况下*/

{printf("\n\nWhatdoyouwanttodo?

\n\t1).Searchanother2).Modify3).Backmenu[]\b\b");

scanf("%d",&w2);

switch(w2)

{case1:

search1();break;/*继续按照职工学历查找其他对象*/

case2:

w3=modify_data(k,n);break;/*对查找到的对象进行修改*/

case3:

menu();break;/*返回主菜单*/

}

}

}

while(w2==1);

menu();/*返回主菜单*/

}

(4)插入模块

[需求分析]该模块的功能是插入职工记录信息并且不能覆盖原有职工信息。

[流程图]

插入模块

 

调用加载函数

 

让用户输入要插入的职工信息个数

 

调用整条信息输入函数

用户作出选择,输入1or2

1还是2

 

2返回主菜单

1浏览全部

图6插入模块流程图

【程序】

/*************************插入模块*********************/

add()/*插入模块*/

{

inti,n,m,k;

FILE*fp;

n=load();/*加载将要记录的个数*/

printf("Howmanyworkerareyouwanttoadd(0-%d)?

:

",N-1-n);

scanf("%d",&m);/*输入要查如职工信息的个数*/

k=m+n;

for(i=n;i

{

printf("\nInput%dthworkersrecord.\n",i-n+1);

input(i);/*调用整条职工信息输入函数*/

}

if((fp=fopen("worker.txt","ab"))==NULL)

{

printf("cannotopenfile\n");

}

for(i=n;i

if(fwrite(&wor[i],sizeof(structworker),1,fp)!

=1)

printf("filewriteerror\n");

fclose(fp);

printf_back();/*一个任务结束时的选择浏览还是返回的函数*/

}

 

1.4.3公共函数

(1)保存函数save(intn)

[说明]:

形参n控制保存的个数。

[程序]:

voidsave(intn)

{FILE*fp;/*定义文件指针*/

inti;

if((fp=fopen("worker.txt","wb"))==NULL)/*以只写方式打开二进制文件,若打不开返回NULL值*/

{printf("\nCannotopenfile\n");

}

for(i=0;i

if(fwrite(&wor[i],sizeof(structworker),1,fp)!

=1)/*若读写成功,则返回值1*/

printf("filewriteerror\n");

fclose(fp);/*关闭文件*/

}

(2)加载函数load()

[说明]:

该函数可以用来加载所有记录,并且可以返回所有记录的个数。

[程序]:

intload()

{FILE*fp;

inti;

if((fp=fopen("worker.txt","rb"))==NULL)/*以只读方式打开二进制文件,若打不开返回NULL值*/

{printf("\nCannotopenfile\n");

returnNULL;}

for(i=0;!

feof(fp);i++)/*在文件关闭之前,向磁盘文件中读入数据块*/

fread(&wor[i],sizeof(structworker),1,fp);

fclose(fp);

return(i-1);/*返回数据块数值*/

}

(3)职工号输入函数no_input(inti,intn)

[说明]:

该函数对输入职工号进行判断,确保输入的职工号唯一。

形参i表示第i个职工记录,形参n表示总共有n个职工记录。

[程序]:

voidno_input(inti,intn)

{intj,k,w1;

do/*该do-while循环语句用来输入职工号信息并判断号码是否重复*/

{w1=0;

printf("number:

");

scanf("%s",wor[i].number);

for(j=0;wor[i].number[j]!

='\0';j++)/*判断输入的号码是否由0-9间的数字组成*/

if(wor[i].number[j]<'0'||wor[i].number[j]>'9')/*输入数字不是有0-9之间的数字组成*/

{puts("Inputerror!

Onlybemadeupof(0-9).Pleasereinput!

\n");

w1=1;break;}

if(w1!

=1)/*w1!

=1表示输入数字正确*/

for(k=0;k

if(k!

=i&&strcmp(wor[k].number,wor[i].number)==0)/*判断输入的职工号是否已经重复*/

{puts("Thisrecordisexist.pleasereinput!

\n");

w1=1;break;}

}

while(w1==1);/*w1==1表示输入数字有误或者输入的职工号重复*/

}

(4)输入整一个记录函数input(inti)

[说明]:

形参i表示第i个职工记录。

[程序]:

voidinput(inti)

{no_input(i,i);/*调用职工号输入函数*/

printf("name:

");scanf("%s",wor[i].name);

printf("age:

");scanf("%s",wor[i].age);

printf("sex:

");scanf("%s",wor[i].sex);

printf("adress:

");scanf("%s",wor[i].adress);

printf("telephone:

");scanf("%s",wor[i].telephone);

printf("salary:

");scanf("%s",wor[i].salary);

printf("xueli:

");scanf("%s",wor[i].xueli);

}

(5)显示一个记录的函数printf_one(inti)

[说明]:

形参i表示第i个职工记录。

[程序]:

voidprintf_one(inti)

{

printf("%11s%6s%9s%3s%8s%11s%7s%6s\n",

wor[i].number,wor[i].name,wor[i].age,wor[i].sex,wor[i].adress,

wor[i].telephone,wor[i].salary,wor[i].xueli);

}

(6)一个任务结束时的选择浏览还是返回的函数printf_back()

voidprintf_back()

{intk,w;

printf("\n\n\tSuccessful^-^.\n\n");

printf("Whatdoyouwanttodo?

\n\n\t1).Browseallnow\t2).Back:

[]\b\b");

scanf("%d",&w);

if(w==1)browse();/*输入1再次浏览*/

elsemenu();}/*返回主菜单*/

(7)修改整条数据记录函数modify_data(inti,intn)

[说明]:

形参i表示第i个职工记录,形参n表示有n个记录,此函数带回保存控制值w1,当w1=1时表示确认保存。

[程序]:

modify_data(inti,intn)

{intc,w1;

do/*判断输入数字是否在选择范围之内*/

{puts("\nmodifyby=>\n\n1).number2).name3).cancelandback");

printf("Whichyouneeded?

:

[]\b\b");

scanf("%d",&c);

if(c>3||c<1)/*输入数字不在选择范围之内*/

{puts("\nChoiceerror!

pleaseagain!

");getchar();}

}

while(c>3||c<1);

do/*按照选择输出对应数据块*/

{switch(c)

{case1:

no_input(i,n);break;

case2:

printf("name:

");scanf("%s",wor[i].name);break;

case3:

menu();break;}

puts("\nNow:

\n");

printf_face();

printf_one(i);/*显示一个记录的函数*/

printf("\nAreyousure?

\n\n\t1).sure2).noandremodify3).backwithoutsaveinthistime[]\b\b");

scanf("%d",&w1);

if(w1==1)save(n);/*对所输入或修改数据进行保存*/

}

while(w1==2);

return(w1);/*返回保存控制值*/

}

1.5上机操作

1.5.1数据源;

1.5.2编译、连接和运行;

1.5.3结果;

下面是各个模块的截面图:

(1)主菜单函数

图7主菜单截图

(2)输入模块:

主界面出现后输入1回车显示下图:

图8输入模块截图

输入要输入的记录然后逐条增加,并进行职工号是否重复的检查,如重复则显示输入重复请重新输入:

如下图:

图9截图

(3)浏览模块

图10浏览模块截图

(4)查找模块

图11截图

按职工号查找

图12按职工号查询截图

按学

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1