圖書管理系統(tǒng)
本題目設(shè)計(jì)目的是訓(xùn)練學(xué)生的基本編程能力,了解管理信息系統(tǒng)的開發(fā)流程,熟悉C語言的文件和單鏈表的各種基本操作。本程序中涉及結(jié)構(gòu)體、文件等方面的知識(shí)。通過本程序的訓(xùn)練,使學(xué)生能對(duì)C語言的文件操作有一個(gè)更深刻的了解,掌握利用文件存儲(chǔ)結(jié)構(gòu)實(shí)現(xiàn)對(duì)圖書管理的原理,為進(jìn)一步開發(fā)出高質(zhì)量的管理信息系統(tǒng)打下堅(jiān)實(shí)的基礎(chǔ)。
1自定義問題
圖1.0
創(chuàng)建一個(gè)圖書管理系統(tǒng)。假設(shè)圖書管理系統(tǒng)中僅僅包含圖書的書名和編號(hào)和作者等信息。程序的運(yùn)行效果如圖1.0所示,選擇任意菜單后,實(shí)現(xiàn)相應(yīng)功能
2系統(tǒng)設(shè)計(jì)
2.1總體設(shè)計(jì)
采用模塊化的程序設(shè)計(jì)方法,即將較大的任務(wù)按照一定的原則分為一個(gè)個(gè)較小的任務(wù),然后分別設(shè)計(jì)各個(gè)小任務(wù)。需要注意的是劃分出來的模塊應(yīng)該相對(duì)獨(dú)立但又相關(guān),且容易理解??梢杂媚K化層次結(jié)構(gòu)圖(即模塊圖)來分析其任務(wù)的劃分,一般從上到下進(jìn)行,最上面一層是主模塊,下面各層是其上一層模塊的逐步細(xì)化描述
2.2 詳細(xì)設(shè)計(jì)
2.2.1數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
- 圖書信息結(jié)構(gòu)體
- struct describe
- {
- char book_name [10]; //書名
- int num ;//編號(hào)
- char author [10]; }book[N]//作者
2.2.2主控main()函數(shù)執(zhí)行流程
圖2.2? 主控函數(shù)執(zhí)行流程圖
2.2.3 初始化圖書模塊:choice1()//初 始 化 圖 書函數(shù)。?? 對(duì)圖書進(jìn)行輸入和保存,
choice1()//初 始 化 圖 書函數(shù)
{
int i,j,temp;//
printf("--------------初 始 化 圖 書 信 息---------------n");
printf("初始化圖書的本書: ");
scanf("%d",&temp);
printf("--------書名 編號(hào) 作者 n");
for(i=0;i<temp;i++)
{
printf("第%d本書:",i+1);
scanf("%s%d%s",book[i].book_name,&book[i].num,book[i].author);
for(j=0;j<i;j++)
{
again:
if((strcmp(book[i].book_name,book[j].book_name))==0||book[i].num==book[j].num)
{
printf("初始化失敗!------你輸入的數(shù)據(jù)違背了主鍵的唯一性!n");
printf(" 書名 編號(hào) 作者 n");
printf("第%d本書:",i+1);
scanf("%s%d%s",book[i].book_name,&book[i].num,book[i].author);//重新輸入書本信息
goto again;
}
}
}
FILE* fp;
if((fp=fopen("book.txt","wb"))==NULL)
{
printf("cannot open filen");
return;
}
for(i=0;i<temp;i++)
{
if(fwrite(&book[i],sizeof(struct describe ),1,fp)!=1)
printf("file write errorn");
}
fclose (fp);
}
該函數(shù)對(duì)圖書進(jìn)行初始化錄入保存,首先調(diào)用程序,首先輸入要錄入的圖書的本書,如圖
先輸入要初始化的本數(shù)為1;接下來輸入書的名字;編號(hào);作者如圖
輸入完后,函數(shù)將結(jié)果保存到book.txt文件中.
2.2.4 /增 加 圖 書模塊,對(duì)圖書館購進(jìn)新書時(shí)要對(duì)新書進(jìn)行錄入保存在圖書管理系統(tǒng)。
choice2()//增 加 圖 書函數(shù)
{
int i,m=0,y=1;
FILE *fp ;
printf("----------------增 加 圖 書 信 息----------------n");
if((fp=fopen("book.txt","rb"))==NULL)
{
printf("cannot open filen");
exit(0) ;
}
while((fread(&book[m],sizeof(struct describe ),1,fp))!=0)
m++ ;
fclose(fp);
while(y)
{
again:
printf("書名 編號(hào) 作者n");
scanf("%s%d%s",book[m].book_name,&book[m].num,book[m].author);
for(i=0;i<m;i++)
{
if((strcmp(book[i].book_name,book[m].book_name))==0||book[i].num==book[m].num)
{printf("添加圖書失??!----你輸入的數(shù)據(jù)違背了主鍵的唯一性!n");
goto again;}
}
printf("是否繼續(xù)(1繼續(xù)or 0結(jié)束):");
getchar();
scanf("%d",&y);
m++;
}
if((fp=fopen("book.txt","wb"))==NULL)
{
printf("cannot open filen");
exit(0) ;
}
for(i=0;i<m;i++)
{
if(fwrite(&book[i],sizeof(struct describe ),1,fp)!=1)//保存函數(shù)
printf("file write errorn");
}
fclose (fp);
}
該模塊主要對(duì)圖書館新購買回來的書籍進(jìn)行錄入保存,輸入數(shù)字2進(jìn)入choice2()函數(shù),依次輸入書本的名字,編號(hào),作者。函數(shù)要求輸入1和0,以判斷是否繼續(xù)輸入圖書信息;如圖
如果繼續(xù)輸入就輸入1或者結(jié)束就輸入0。
2.2.5修改圖書模塊:該模塊對(duì)輸入有錯(cuò)誤的圖書的信息進(jìn)行修改。在主菜單中輸入數(shù)字3,進(jìn)入choice2()函數(shù),
choice3()//修 改 圖 書函數(shù)
{
printf("----------------修 改 圖 書 信 息----------------n");
FILE *fp ;
int temp ;
again:
printf("輸入你要修改的圖書的編號(hào):");
scanf("%d",&temp);
struct describe update ;//再定義一個(gè)struct describe的結(jié)構(gòu)體
int i=0,k=0,j;
if((fp=fopen("book.txt","rb+"))==NULL)
{
printf("cannot open filen");
exit(0);
}
int n=10000;
while((fread(&book[k],sizeof(struct describe),1,fp))!=0)
{
if(book[k].num==temp)
n=k;
k++;
}
fclose(fp);
if(n==10000)
{
printf("你要-修改的-圖書-不存在!n");
getchar();
goto again ;
}
printf("書名 編號(hào) 作者n");
scanf("%s%d%s",update.book_name,&update.num,update.author);
for(j=0;j<k;j++)
{
if(j==n) continue ;
else
if((strcmp(book[j].book_name,update.book_name))==0||book[j].num==update.num)
{
printf("修改圖書信息失?。∧斎氲臄?shù)據(jù)違背了主鍵的唯一性!n");
goto again ;
}
}
if((fp=fopen("book.txt","rb+"))==NULL)
{
printf("cannot open filen");
exit(0);
}
while((fread(&book[i],sizeof(struct describe),1,fp))!=0)
{
if(book[i].num==temp)
{
fseek(fp,-sizeof(struct describe),1);//把文件fp向前后推sizeof(struct describe)字節(jié)
fwrite(&update,sizeof(struct describe ),1,fp);
fclose(fp);
}
i++;