#include<stdio.h>
#include<stdlib.h>//可以呼叫system函式庫
#include<string.h>
//圖書資訊結構體
struct book1
{
char isbn[20];//ISBN
char name[20];//書名
char author[20];//作者
char print[20];//出版社
char zone[15];//編號
int amount;//庫存量
float price;//價格
};
struct book
{
struct book1 book1;//圖書資訊結構體
struct book *next;
};
void menu();//主選單
void menu1();//管理者選單
void menu2();//用戶選單
void backmenu1();//實作回傳管理者功能選單函式
void backmenu2();//用戶功能選單函式
void add(); //增加
void display();//顯示
void change();//修改
void enter();//資料錄入
void find();//查找
void delete();//洗掉
void browser();//瀏覽
void insert();//插入
void sort();//排序
void lendbook();//借閱
void returnbook();//還書
struct book *read();//檔案資料傳入鏈表
void write(struct book *head);//鏈表資料寫入檔案
int main()
{
char c;
system("color 0A");
menu();
printf("管理員請輸入m,用戶請輸入n,退出請按0\n");
scanf("%c",&c);
while(c!='0')//當輸出不是退出鍵時
{
if(c=='m')
{
backmenu1();//進入管理者功能
break;
}
else
if(c=='n')
{
backmenu2();//進入用戶功能
break;
}
else
{
printf("輸入錯誤請重新輸入!\n");
scanf("%c",&c);
}
scanf("%c",&c);
}
if(c=='0')
printf("您已成功退出圖書管理系統!\n");
return 0;
}
//登錄界面
void menu()
{
printf("*-----------------------------------圖書管理系統------------------------------------*\n");
printf("*-----------------------------------------------------------------------------------*\n");
printf("* 登錄選項 *\n");
printf("* 1.管理員 2.用戶 *\n");
printf("*-----------------------------------------------------------------------------------*\n");
printf("\n");
}
// 管理員界面
void menu1()
{
printf("*---------------------------------圖書管理系統-------------------------------------*\n");
printf("* *\n");
printf("*---------------------------------管理員功能串列-----------------------------------*\n");
printf("* *\n");
printf("*1.錄入圖書 2.增加圖書 3.顯示圖書 *\n");
printf("*4.修改圖書資訊 5.查找圖書 6.洗掉圖書 *\n");
printf("*7.瀏覽圖書 8.圖書排序 9.插入圖書 *\n");
printf("*----------------------------------------------------------------------------------*\n");
printf("\n");
}
//用戶界面
void menu2()
{
printf("***********************************圖書管理系統*************************************\n");
printf("* *\n");
printf("*----------------------------------用戶功能串列------------------------------------*\n");
printf("* *\n");
printf("*1.借閱書籍 2.查詢書籍 3.歸還書籍 *\n");
printf("*4.瀏覽書籍 *\n");
printf("*----------------------------------------------------------------------------------*\n");
printf("\n");
}
//實作回傳管理者功能選單函式
void backmenu1()
{
FILE *fp;
int n=1;
while(n!=0)
{
menu1();//在這個回圈中,每執行一次功能后會繼續顯示選單
printf("請選擇以上功能,退出系統請按0\n");
printf("\n");
scanf("%d",&n);
fp=fopen("libraries.txt","r");
if((n>=3&&n<=9)&&(fp==NULL||fgetc(fp)==EOF))//當無檔案或者檔案內容空白時且選擇非(錄入添加顯示)功能
{
printf("沒有書籍,建議管理員先錄入書籍資訊\n");
system("cls");
}
else
{
switch(n)
{
case 1:enter();break;
case 2:add();break;
case 3:display();break;
case 4:change();break;
case 5:find();break;
case 6:delete();break;
case 7:browser();break;
case 8:sort();break;
case 9:insert();break;
}
}
fclose(fp);
}
printf("\n");
if(n==0)
printf("您已成功退出圖書管理系統!\n");
}
//用戶功能選單函式
void backmenu2()
{
FILE *fp;
int n=1;
while(n!=0)
{
menu2();
printf("選擇功能,退出請按0\n");
scanf("%d",&n);
fp=fopen("libraries.txt","r");
if((fp==NULL||fgetc(fp)==EOF))//當無檔案或者檔案內容空白時
printf("圖書館內暫無藏書哦,請耐心等待\n");
else
{
switch(n)
{
case 1:lendbook();break;
case 2:find();break;
case 3:returnbook();break;
case 4:browser();break;
}
}
fclose(fp);
}
if(n==0)
printf("您已成功退出圖書管理系統\n");
}
//檔案資料傳入鏈表
struct book* read()
{
FILE *fp;
struct book1 book1;
struct book *p,*tail=NULL,*head=NULL;
fp=fopen("libraries.txt","r");
if(!fp)
{
printf("cannot open file\n");
exit(0);
}
while(fscanf(fp,"%s%s%s%s%s%d%f",book1.isbn,book1.zone,book1.name,book1.author,book1.print,&book1.amount,&book1.price)!=EOF)//在檔案未遇到結束標志時讀取資料
{
p=(struct book*)malloc(sizeof(struct book));//開辟空間創建鏈表
p->book1=book1;
if(head==NULL)
head=p;
if(tail!=NULL)
tail->next=p;
tail=p;
tail->next=NULL;
}
fclose(fp);
return head;
}
//鏈表寫入檔案
void write(struct book *head)
{
FILE *fp;
struct book *p=NULL;
fp=fopen("libraries.txt","w");
if(!fp)
{
printf("cannot open file\n");
exit(0);
}
p=head;
while(p)
{
//將資料寫入檔案
fprintf(fp,"%-20s%-15s%-15s%-15s%-19s%-14d%-12.2f ",p->book1.isbn,p->book1.zone,p->book1.name,p->book1.author,p->book1.print,p->book1.amount,p->book1.price);
p=p->next;
}
fclose(fp);
}
//資料錄入
void enter()
{
FILE *fp;
int i,n;
struct book1 book1;
system("cls");
printf("輸入錄入的書籍數量\n");
scanf("%d",&n);
printf("按以下格式輸入\n");
printf("ISBN 磁區 書名 作者 出版社 數量 單價\n");
fp=fopen("libraries.txt","w");
if(!fp)
{
printf("cannot open file\n");
exit(0);
}
for(i=0;i<n;i++)
{
//將資料寫入檔案
scanf("%s%s%s%s%s%d%f",book1.isbn,book1.zone,book1.name,book1.author,book1.print,&book1.amount,&book1.price);
fprintf(fp,"%-20s%-15s%-15s%-15s%-19s%-14d%-12.2f ",book1.isbn,book1.zone,book1.name,book1.author,book1.print,book1.amount,book1.price);
}
fclose(fp);
}
//增加圖書
void add()
{
struct book *p=NULL,*p1=NULL,*head=NULL,*p2;
char n=1;
system("cls");
printf("按以下格式輸入\n");
printf("ISBN 磁區 書名 作者 出版社 數量 單價\n");
p=head=read();//從檔案讀取資料
p2=(struct book*)malloc(sizeof(struct book));
scanf("%s%s%s%s%s%d%f",p2->book1.isbn,p2->book1.zone,p2->book1.name,p2->book1.author,p2->book1.print,&p2->book1.amount,&p2->book1.price);
while(p)
{
if(strcmp(p->book1.name,p2->book1.name)==0)//與已有書籍重名
{
p->book1.amount++;
printf("添加成功\n");
printf("原書籍數量增加\n");
break;
}
else
p=p->next;
}
if(head==NULL) //確定新書鏈接位置
head=p2;
else
{ //尾部添加資料
p1=head;
while(p1->next!=NULL)
p1=p1->next;
p1->next=p2;
p2->next=NULL;
}
write(head); //將資料寫入檔案
n=getchar();
printf("書籍添加成功\n");
display();
}
//顯示所有圖書
/*為了節省空間,可以直接用一個結構體,邊讀取,邊輸出*/
void display()
{
struct book1 book1;
FILE *fp;
system("cls");//實作清屏,重繪螢屏
printf("圖書館庫存\n");
printf("\n");
fp=fopen("libraries.txt","r");
if(!fp)
{
printf("cannot open file\n");
exit(0);
}
else
{
printf("ISBN 磁區 書名 作者 出版社 數量 單價\n");
while(fscanf(fp,"%s%s%s%s%s%d%f",book1.isbn,book1.zone,book1.name,book1.author,book1.print,&book1.amount,&book1.price)!=EOF)
{
printf("%-20s%-15s%-15s%-15s%-19s%-14d%-12.2f\n",book1.isbn,book1.zone,book1.name,book1.author,book1.print,book1.amount,book1.price);
}
}
fclose(fp);
printf("\n");
}
//修改圖書資訊
void change()
{
struct book *p,*head,*q=NULL;
system("cls");
int n=1,amount;
char isbn[20]={'\0'},name[20]={'\0'},author[20]={'\0'},print[20]={'\0'},name1[20]={'\0'},zone[15]={'\0'};
float price;
p=head=read();
display();
printf("輸入要修改的圖書書名\n");
scanf("%s",name);
while(p)
{
if(strcmp(p->book1.name,name)==0)//查找要修改的書籍,找到后跳出回圈
{
q=p;
break;
}
else
p=p->next;
}
while(n!=0)
{
printf("請選擇您要修改的資訊,退出修改請按0\n");
printf("*------------------------------------------------------*\n");
printf("*1.修改ISBN序號 2.修改作者資訊 3.修改出版社資訊 *\n");
printf("*4.修改數量 5.修改單價 6.修改書名 *\n");
printf("*7.修改編號 *\n");
printf("*------------------------------------------------------*\n");
scanf("%d",&n);
switch(n)
{
case 1: printf("輸入新ISBN序號:"); scanf("%s",isbn); strcpy(q->book1.isbn,isbn);break;
case 2: printf("輸入新作者資訊:"); scanf("%s",author); strcpy(q->book1.author,author);break;
case 3: printf("輸入新出版社資訊;");scanf("%s",print); strcpy(q->book1.print,print);break;
case 4: printf("輸入新數量;"); scanf("%d",&amount); q->book1.amount=amount;break;
case 5: printf("輸入新單價;"); scanf("%f",&price); q->book1.price=price;break;
case 6: printf("輸入新書名:"); scanf("%s",name1); strcpy(q->book1.name,name1);break;
case 7: printf("輸入新編號:"); scanf("%s",zone); strcpy(q->book1.zone,zone);break;
/*default :printf("輸入錯誤,請重新輸入!\n");break;*/
}
}
write(head); //將修改后的資訊存入檔案
printf("修改成功!\n");
display();
}
//查找書籍
void find()
{
struct book *head=NULL,*p;
char name[20]={'\0'};
int flag=0;
char n=1;
system("cls");
head=read();//讓head指向傳入檔案資料的鏈表
p=head;
printf("輸入查找書籍相關資訊(ISBN/書名/作者)(注意不得超過20個字):\n");
scanf("%s",name);
while(p)
{
if(strcmp(p->book1.name,name)==0||strcmp(p->book1.author,name)==0||strcmp(p->book1.isbn,name)==0)
{
printf("ISBN 磁區 書名 作者 出版社 數量 單價\n");
printf("%-20s%-15s%-15s%-15s%-19s%-14d%-12.2f\n",p->book1.isbn,p->book1.zone,p->book1.name,p->book1.author,p->book1.print,p->book1.amount,p->book1.price);
printf("\n");
flag=1;
break;
}
else
p=p->next;
}
if(flag==0)
printf("沒有此書籍,請確認書名是否正確!\n");
printf("\n");
}
//瀏覽書籍的數量
void browser()
{
struct book *p=NULL,*head;
system("cls");
head=read();
p=head;
if(p==NULL)
printf("沒有書籍\n");
else
{
printf("已有書籍如下\n");
printf("書名 數量\n");
while(p)
{
printf("%-15s%14d\n",p->book1.name,p->book1.amount);
p=p->next;
}
}
}
//洗掉書籍
void delete()
{
struct book *p1=NULL,*p2=NULL,*head=NULL;
char name[20]={'\0'};
char ch;
p1=p2=head=read
uj5u.com熱心網友回復:
你說一下哪里報錯了啊,最好帶上圖uj5u.com熱心網友回復:
把錯誤描述一下,是編譯時刻還是運行時刻錯誤,什么型別錯誤等uj5u.com熱心網友回復:
是啊,是哪兒出錯了?轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/42729.html
標籤:C語言
上一篇:關于檔案指標
下一篇:c語言問題請教大佬們
