圖書管理系統主要要求可以錄入書籍,添加書目,查找書本信息,刪除或修改信息,有的還要求顯示是否被借閱等。
壹般采用結構體數組,鏈表,文件操作和自定義函數。主要是需要對基礎知識掌握牢固。
先定義結構體,然後對結構體的成員進行定義,選擇數組存儲書本各種信息。錄入信息可以用for和do while循環等來做。
存放信息需要文件操作函數,比如fopen,fwrite等。
刪除和添加可以刪除節點或者增加節點。
查找之類的可以用字符串操作的各種函數實現。
附上參考源代碼
#include?<stdio.h>#include?<string.h>
#include?<stdlib.h>
#include?<conio.h>
#definebooks?"f:\\books.txt"
#define?booksbak"f:\\booksbak.txt"
struct?bookinfo
{
char?isbn[20];
char?title[30];
char?author[20];
int?count;
};
struct?book
{
struct?bookinfo?onebook;
struct?book?*next;
};
struct?book?*searchBook?(?struct?book?*listptr,char?isbn[])
{
while(listptr!=(struct?book?*)0)
if?(strcmp(listptr->onebook.isbn,isbn)==0)
return?listptr;
else
listptr=listptr->next;
return?(struct?book?*)0;
}
void?MainSearchbook(struct?book?*firstptr)
{
struct?book?*ptr;
char?isbnno[20];
printf("請輸入ISBN:");
scanf("%s",&isbnno);
ptr=searchBook(firstptr,isbnno);
if?(ptr!=(struct?book?*)0)
{
printf("找到了!!!\n");
printf("ISBN:%s\n",ptr->onebook.isbn);
printf("Title:%s\n",ptr->onebook.title);
printf("Author:%s\n",ptr->onebook.author);
}
else
printf("sorry,not?found!!!\n");
}
int?addBook(struct?book?*listptr,struct?bookinfo?note)
{
while(listptr->next!=0)
listptr=listptr->next;
listptr->next=(struct?book?*)malloc(sizeof(struct?book));
listptr->next->onebook=note;
listptr->next->next=0;
return?0;
}
void?MainAdd(struct?book?*listptr,FILE?*fp)
{
int?ok;
struct?bookinfo?note;
printf("請輸入ISBN:");
scanf("%s",?e.isbn);
printf("請輸入Title:");
scanf("%s",?e.title);
printf("請輸入Author:");
scanf("%s",?e.author);
ok=addBook(listptr,note);
if?(ok==0)
{
//將加入的圖書寫到文件中保存
fprintf(fp,"\n%s?%s?%s?%d",note.isbn,note.title,note.author,0);
printf("添加圖書成功!!!\n");
}
else
printf("添加圖書失敗!!!\n");
}
int?removeBook(struct?book?*listptr,char?isbn[])
{
while(listptr->next!=(struct?book?*)0)
{
if?(strcmp(listptr->next->onebook.isbn,isbn)==0)
{
listptr->next=listptr->next->next;
return?0;
}
else
listptr=listptr->next;
}
return?-1;
}
void?MainRemove(struct?book?*listptr,FILE?*fp)
/************************************************************************/
/*?刪除書籍函數,通過ISBN刪除鏈表節點,同時刪除文件中對應信息*/
/*?刪除文件中壹行,用的是笨方法,把需要的信息寫到新文件,刪除舊文件,重命名..*/
/************************************************************************/
{
char?isbnno[20];
int?ok;
struct?bookinfo?onebook;
printf("請輸入ISBN:");
scanf("%s",&isbnno);
ok=removeBook(listptr,isbnno);
if?(!ok)
{
FILE?*fpbak;
if?((fpbak=fopen(booksbak,"a+"))==NULL)
printf("文件打開失敗!!!\n");
fseek(fp,0,SEEK_SET);?//移到文件開始
while((fscanf(fp,"%s?%s?%s?%d\n",&onebook.isbn,&onebook.title,&onebook.author,&onebook.count))!=EOF)
{
if?(strcmp(onebook.isbn,isbnno)!=0)
{
fprintf(fpbak,"%s?%s?%s?%d\n",onebook.isbn,onebook.title,onebook.author,onebook.count);
}
}
fclose(fp);
fclose(fpbak);
if?(remove(books))?//刪除失敗返回非0
{
printf("刪除文件失敗!!!\n");
return?;
}
else
if?(rename(booksbak,books))//重命名失敗返回非0值
{
printf("重命名失敗!!!\n");
return?;
}
printf("刪除成功!!!\n");
}
else
printf("查無此書!!!");
}
intchoice(void)
{
int?c;
printf("1.查看圖書\n");
printf("2.添加圖書\n");
printf("3.刪除圖書\n");
printf("4.退出程序\n");
printf("請選擇序號:");
return?c=getchar();
//return?c=getche();
printf("\n\n");
}
int?addEntry(FILE?*fp,struct?book?*firstptr)
/************************************************************************/
/*主要用來加載文件中存放的圖書信息*/
/************************************************************************/
{
struct?bookinfo?onebook;
while((fscanf(fp,"%s?%s?%s?%d\n",&onebook.isbn,&onebook.title,&onebook.author,&onebook.count))!=EOF)
{
while(firstptr->next!=0)
firstptr=firstptr->next;
firstptr->next=(struct?book?*)malloc(sizeof(struct?book));
firstptr->next->onebook=onebook;
firstptr->next->next=0;
}
return?0;
}
int?main(int?argc,char?*argv[])
{
int?ch;
struct?book?first;
strcpy(first.onebook.isbn,"123456");
strcpy(first.onebook.title,"Programming?C");
strcpy(first.onebook.author,"yhb");
first.next=0;
struct?book?*firstptr=&first;?//鏈表頭指針
FILE?*fp;
if?((fp=fopen(books,"a+"))==NULL)
printf("文件打開失敗!!!");
addEntry(fp,firstptr);
while(1)
{
system("CLS");?//清屏
/************************************************************************/
/*想想這裏為什麽要清空緩沖區*/
/*由於上壹次(choice函數)的getchar(),還有壹個'\n'留在緩沖區....*/
/*可以把這句話註釋掉看看,沒有這句話會遇到麻煩?*/
/*如果不用fflush,可以將上面的getchar()換成getche()*/
/*比較getchar(),getch(),getche()......*/
/************************************************************************/
fflush(stdin);?
ch=choice()-48;
switch?(ch)
{
case?1:
MainSearchbook(firstptr);
break;
case?2:
MainAdd(firstptr,fp);
break;
case?3:
MainRemove(firstptr,fp);
break;
case?4:
printf("謝謝使用...\n");
exit(0);
default:
printf("請輸入正確序號!");
}
system("PAUSE");
}
return?0;
}