題??? 目: 圖書信息管理系統(tǒng)?
圖書信息管理系統(tǒng)
本題目設(shè)計目的是訓(xùn)練學(xué)生的基本編程能力,了解圖書管理信息系統(tǒng)的開發(fā)流程,熟悉C語言的文件的基本操作。本程序中涉及結(jié)構(gòu)體、文件等方面的知識。通過本程序的訓(xùn)練,使學(xué)生能對C語言的文件操作有一個更深刻的了解,掌握利用文件存儲結(jié)構(gòu)實(shí)現(xiàn)對學(xué)生成績管理的原理,為進(jìn)一步開發(fā)出高質(zhì)量的圖書管理系統(tǒng)打下堅實(shí)的基礎(chǔ)。
1、題目要求
設(shè)計“圖書信息管理系統(tǒng)”
要求:
圖書信息包括:書號、書名、作者、價格等。使之提供以下功能:
- 系統(tǒng)以菜單方式工作。
- 圖書信息錄入功能。(圖書信息用文件保存)。
- 圖書信息瀏覽功能。
- 圖書信息的導(dǎo)入。
- 圖書信息的修改。
- 圖書信息查詢功能。
- 圖書信息的刪除。
- 圖書信息的保存和返回主菜。
2、分析:
??? 根據(jù)題目要求,應(yīng)當(dāng)把圖書信息用結(jié)構(gòu)體形式輸入,再定義一個全局變量和文件指針進(jìn)行整個程序的運(yùn)行,然后把圖書信息送到文件中,所以應(yīng)該提供一個結(jié)構(gòu)體和文件的輸入輸出等操作;在程序中需實(shí)現(xiàn)圖書信息錄入,瀏覽,查詢,修改和刪除等功能的操作,在運(yùn)行時達(dá)到所要目。
3、總體設(shè)計:
根據(jù)題目要求,可以將系統(tǒng)分為十三個模塊:
- 菜單選擇模塊。
- 圖書信息數(shù)據(jù)寫入文件。
- 圖書信息數(shù)據(jù)文件的導(dǎo)入。
- 圖書信息主菜單的打印。
- 輸出*與輸出~。
- 提供開關(guān)的效果。
- 圖書信息的輸入。
- 圖書信息的打印。
- 圖書信息的修改。
- 圖書信息的查找。
- 圖書信息的刪除。
- 圖書信息的保存。
- 返回主菜單。
4:部分程序設(shè)計:
頭函數(shù)名:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#define N 80
struct book_type
{char booknum[20];?????????????????? /*書號*/
char bookname[20];??????? ??????????????/*書名*/
char authorname[20];????????????????? /*作者*/
char price[20];????????????????????? //價格
}person[N];?????????????????????? /*存儲圖書信息*/
4.1:功能模塊
void menu();????????????????????? /*菜單函數(shù)*/
void display1();????????????????? /*執(zhí)行打印的功能*/
void display2();????????????????? /*執(zhí)行打印的功能*/
void reserve();?????????????????? /*保存到數(shù)組*/
void read();????????????????????? /*導(dǎo)入圖書信息*/
void delay();???????????????????? /*提供開關(guān)的效果*/
void choose();??????????????????? /*提供選擇的功能*/
void enter();???????????????????? /*圖書信息的輸入*/
void printfinformation();???????? /*圖書信息的打印*/
void modify();???????????????????? /*圖書信息的修改*/
void search();??????????????????? /*圖書信息的查找*/
void del();?????????????????????? /*圖書信息的刪除*/
void save();????????????????????? /*圖書文件信息的保存*/
void back();????????????????????? /*返回主菜單*/
char ch;????????????????????????? /*存儲主菜單的調(diào)用選項(xiàng)信息*/
int number=0,temp1,temp2=0;?????? /*記錄每次輸入的人數(shù)*/
void main()
{system("color 0e");????????????? //選擇顏色
menu();?????????????????????????? //菜單函數(shù)
do
{scanf(" %c",&ch);
system("cls");??????????????????? //清屏功能
choose();
}while(ch!='8');????????????????? //循環(huán)條件的判斷
}
//提供主菜單的選擇功能
void choose()
{switch(ch)
{case'1':enter();
break;
case'2':printfinformation();
back();
break;
case'3':modify();
back();
break;
case'4':search();
//back;
break;
case'5':del();
break;
case'6':save();
break;
case'7':read();
back();
case'8':printf("nnt感謝您的使用!n");
break;
default:menu();
printf("nnt請重新選擇:");
}
注釋:圖書信息以數(shù)據(jù)的形式寫入文件,以文件的形式保存圖書信息數(shù)據(jù)
//圖書信息數(shù)據(jù)寫入文件
void reserve()
{FILE *fp=NULL;
FILE *fp1=NULL;
int i;
if((fp=fopen("book.txt","w"))==NULL)??????????????????????????????????????????? //以文本只寫方式打開文件
{printf("不能打開文件");
exit(0);
}
if((fp1=fopen("book1.txt","w"))==NULL)????? ??????????????????????????????????????//以文本只寫方式打開文件
{printf("不能打開文件");
exit(0);
}
fprintf(fp1,"%20dn",number);
for(i=temp2;i<number;i++)
{fprintf(fp,"%10s%15s%15s%15sn",person[i].booknum,person[i].bookname,person[i].authorname,person[i].price);?????? //寫入文件
}
fclose(fp1);
fclose(fp);???????????????????????????????????????????????????????????????????? //關(guān)閉文件
}
注釋:當(dāng)圖書信息不能打開時則關(guān)閉文件,返回菜單。
//圖書信息數(shù)據(jù)文件的讀取/導(dǎo)入
void read()
{FILE *fp;//=NULL;
FILE *fp1;
int i=0;
if((fp1=fopen("book1.txt","rb+"))==NULL)???????? 以文本只讀方式重新打開文件
{printf("不能打開文件");
exit(0);
}
fscanf(fp1,"%4dn",&number);
if((fp=fopen("book.txt","rb+"))==NULL)???? 為了讀與寫,打開一個二進(jìn)制文件
{printf("不能打開文件");
exit(0);
}
for(i=0;i<number;i++)
{fscanf(fp,"%11s%11s%11s%11sn",person[i].booknum,person[i].bookname,person[i].authorname,person[i].price);
//讀文件
printf("%11s%11s%11s%11sn",person[i].booknum,person[i].bookname,person[i].authorname,person[i].price);
//輸出文件數(shù)據(jù)
}
reserve();
fclose(fp1);
fclose(fp);
menu();
back();
}
//主菜單的打印
void menu()
{char *s[9]={"【1】輸入圖書信息","【2】查看圖書信息","【3】修改圖書信息","【4】查找圖書信息","【5】刪除圖書信息","【6】保存圖書信息","【7】導(dǎo)入圖書信息","【8】退出管理系統(tǒng)","請選擇:"};
int i;
printf("n");
printf("tt");
display1();
printf("圖書管理系統(tǒng)");
display1();
printf("nn");
printf("tt");
display2();
printf("nn");
printf("tt");
for(i=0;i<9;i++)
{display1();
printf("%s",s[i]);
display1();
printf("n");
printf("tt");
}
}
//輸出*
void display1()
{int i;
for(i=0;i<=16;i++)
{printf("*");
delay();
}
}
//輸出~
void display2()
{int i;
for(i=0;i<=24;i++)
{printf("~");
delay();
}
}
//提供開關(guān)的效果
void delay()
{long i,n=4000000;
for(i=0;i<n;i++)
{if(ch!='?') i=n;??????????????? //運(yùn)行過后可消除開關(guān)的延遲效果
}
}
//圖書信息的輸入
void enter()
{int i;
printf("請輸入圖書的冊數(shù):");
scanf("%d",&temp1);
number+=temp1;
for(i=temp2;i<number;i++)???????? //引用中間變量temp2,記錄每次輸入的人數(shù)
{printf("請輸入%d本圖書的信息:",i+1);
printf("t書號:");
scanf("%s",person[i].booknum);
printf("t書名:");
scanf("%s",person[i].bookname);
printf("t作者:");
scanf("%s",person[i].authorname);
printf("t價格:");
scanf("%s",person[i].price);
}
reserve();
temp2+=temp1;
back();?????????????????????????? //返回主菜單
}
//圖書信息的打印
void printfinformation()
{int i;
if(number==0)
{printf("t沒有圖書信息");
}
else
{printf("ntt~~~~~~~~~~~~圖書信息~~~~~~~~~~~~~~~n");
printf("--------------------------------------------------n");
printf("??????? 書號?????? 書名??????? 作者????? 價格n");
printf("--------------------------------------------------n");
for(i=0;i<number;i++)
{printf("%10s%11s%11s%11sn",person[i].booknum,person[i].bookname,person[i].authorname,person[i].price);
printf("--------------------------------------------------n");
}
}
}//圖書信息的修改
//圖書信息的查找
void search()
{int i,k,flag;
char temp[20],temp1;
if(number==0)
{printf("t沒有圖書信息");
}
else
{do
{printf("請輸入你要查找的圖書是書號或書名:");
scanf("%s",temp);
for(i=0;i<number;i++)
{if(strcmp(temp,person[i].booknum)==0||strcmp(temp,person[i].bookname)==0)
{k=i;
flag=1;
break;
}
if(i==(number-1)&&(strcmp(temp,person[i].booknum)!=0)&&(strcmp(temp,person[i].bookname)!=0))
{printf("不存在該圖書n");
flag=0;
}
}
if(flag==1)
{printf("該圖書的信息:n");
printf("--------------------------------------------------n");
printf("3? 書號??? 書名???? 作者???? 價格n");
printf("--------------------------------------------------n");
printf("%5s%7s%9s%9sn",person[k].booknum,person[k].bookname,person[k].authorname,person[k].price);
printf("--------------------------------------------------n");
}
printf("n是否繼續(xù)查找?Y/N:");
scanf("%c",&temp1);
}while(temp1=='y'||temp1=='Y');
}
back();
}
void del()
{int i,k,flag;
char temp[20],temp1;
if(number==0)
{printf("t沒有圖書信息");
}
else
{printfinformation();
do
{printf("請輸入要刪除的圖書信息的書號或書名:");
scanf("%s",temp);
for(i=0;i<number;i++)
{if(strcmp(temp,person[i].booknum)==0||strcmp(temp,person[i].bookname)==0)
{k=i;
flag=1;
break;
}
if(i==(number-1)&&(strcmp(temp,person[i].booknum)!=0)&&(strcmp(temp,person[i].bookname)!=0))
{printf("不存在該圖書n");
flag=0;
}
}
if((flag==1)&&(number==1))
{number--;
temp2--;
printf("該圖書信息已經(jīng)成功刪除nn");
}
if((flag==1)&&(number<=0))
{printf("已經(jīng)沒有圖書信息,請重新輸入!nn");
}
if((flag==1)&&(number>1))
{for(i=k;i<(number-1);i++)
{strcpy(person[i].booknum,person[i+1].booknum);
strcpy(person[i].bookname,person[i+1].booknum);
strcpy(person[i].authorname,person[i+1].authorname);
strcpy(person[i].price,person[i+1].price);
}
number--;
temp2--;
printf("該圖書信息已經(jīng)成功刪除nn");
}
printf("是否繼續(xù)刪除?Y/N");
scanf("%c",&temp1);
}while(temp1=='Y'||temp1=='y');
printf("是否顯示刪除操作后全部圖書信息?Y/N:");
scanf("%c",&temp1);
if(temp1=='y'||temp1=='Y')
{printfinformation();
}
reserve();
}
back();
}
注釋:當(dāng)輸入數(shù)據(jù)時選擇1則返回上次的記錄,2則保存記錄。會輸出相應(yīng)的數(shù)據(jù)。
//保存記錄
void save()
{char temp;
printf("1、讀取上次的記錄:n2、保存現(xiàn)在的記錄:n請選擇:");
scanf("%c",&temp);
if(temp=='1')
{printf("ntt/~~~~~~~~~~~~~圖書信息~~~~~~~~~~~~~~~n");
printf("--------------------------------------------------n");
printf("? 書號??? 書名???? 作者??? 價格n");
read();
back();
}
else
{printf("t程序已經(jīng)保存n");
back();
}
}
//返回主菜單
void back()
{printf("ntt輸入任意鍵返回主菜單:");
getch();????????????????????????? //提供任意鍵返回效果
system("cls");??????????????????? //清屏功能
menu();?????????????????????????? //打印主菜單
}
5運(yùn)行與測試報告:
功能選擇鍵。
輸入圖書信息。
查看圖書信息。
修改圖書信息。
查找圖信息。
刪除圖書信息。
保存圖書信息。
圖書信息的導(dǎo)入。
退出圖書管理系統(tǒng)。
需要全部資料可以在我的資源里下載,資料包括程序文檔、源程序。
需要完整的資料可在我的資源里下載,也可以加入我的紛傳圈子,里面有資源壓縮包的百度網(wǎng)盤下載地址及提取碼。
紛傳?點(diǎn)擊用微信打開即可,過程有點(diǎn)繁瑣請見諒。???????