#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#define N 20
#define T sizeof(struct book)
#define SC "%ld %s %s %s %s
%d",&p1->num,p1->name,p1->author,p1->kind,p1->press,&p1->quantity
#define PR11
"\033[30;42m%-8ld\033[47m%-16s\033[42m%-16s\033[47m%-16s\033[42m%-16s\033[47m%-8d\033[0m\n",p->num,p->name,p->author,p->kind,p->press,p->quantity
#define PR21
"\033[30;47m%-8ld\033[42m%-16s\033[47m%-16s\033[42m%-16s\033[47m%-16s\033[42m%-8d\033[0m\n",p->num,p->name,p->author,p->kind,p->press,p->quantity
#define PR12
"\033[30;42m%-8ld\033[47m%-16s\033[42m%-16s\033[47m%-16s\033[42m%-16s\033[41m%-8d\033[0m\n",p->num,p->name,p->author,p->kind,p->press,p->quantity
#define PR22
"\033[30;47m%-8ld\033[42m%-16s\033[47m%-16s\033[42m%-16s\033[47m%-16s\033[41m%-8d\033[0m\n",p->num,p->name,p->author,p->kind,p->press,p->quantity
#define PR "\033[30;43mnumber name author kind press quantity\033[0m\n"
int password()//----------------------密碼系統
{ int i;
char zh[9],ZH[9]="123456",mm[7],MM[7]="123456";
printf("\t\t\t\t\t\t\t\033[33m請輸入帳号:");
scanf("%s",zh);
printf("\n\033[0m");
while(strcmp(zh,ZH)!=0)
{ printf("\t\t\t\t\t\t\t\033[31m您的輸入錯誤,沒有該帳号!請重輸!\033[0m\n\n");
printf("\t\t\t\t\t\t\t\033[33m請再次輸入帳号:");
scanf("%s",zh);
printf("\n\033[0m");
}
printf("\t\t\t\t\t\t\t\033[33m請輸入密碼:");
system("stty -echo");
scanf("%s",mm);
system("stty echo");
printf("******\n\n\033[0m");
for(i=0;i<7;i++)
{ if(strcmp(mm,MM)==0)
{ printf("\t\t\t\t\t\t \033[32m歡迎進入該系統!按"Enter"鍵進入!\033[0m\n");
return 0;
}
else
{ printf("\t\t\t\t\t\t\t\033[31m輸入密碼錯誤!請重輸!\033[0m\n\n");
printf("\t\t\t\t\t\t\t\033[33m請再次輸入密碼:");
system("stty
-echo");
scanf("%s",mm);
system("stty echo");
printf("******\033[0m\n\n");
}
if(i>=1) return 1;
}
return 0;
}
void table()//------------------Welcome
{ int i;
printf("\033[2J\033[40A");
for(i=0;i<8;i++)
printf("\n");
for(i=0;i<6;i++)
printf("\t\t\t\t\033[32m LL\n");
printf("\t\t\t\tWW WW EEEEEEEE LL CCCCCCCC OOOOOOOO MMMMMMMMMM EEEEEEEE\n");
printf("\t\t\t\tWW WW
EE EE
LL CC CC
OO OO MM MM MM
EE EE\n");
printf("\t\t\t\tWW WW EEEEEEEEEE
LL LL
CC OO OO MM MM MM EEEEEEEEEE\n");
printf("\t\t\t\tWW WW WW
EE LL LL
CC OO OO MM MM MM EE\n");
printf("\t\t\t\tWWWW WWWW
EE EE LL LL CC CC
OO OO MM MM MM
EE EE\n");
printf("\t\t\t\t
WW WW EEEEEEEE LLLL CCCCCCCC OOOOOOOO MM MM MM EEEEEEEE\033[0m\n\n\n");
}
void end()
{ int i;
printf("\033[2J\033[40A");
for(i=0;i<11;i++)
printf("\n");
printf("\t\t\t \033[33mBBBBBBBB BB\n");
printf("\t\t\t BB BB BB\n");
printf("\t\t\t BB BB BB\n");
printf("\t\t\t BB BB BB\n");
printf("\t\t\t BBBBBBBB YY YY EEEEEE BBBBBBBB YY YY EEEEEE\n");
printf("\t\t\t BB BB YY YY EE EE BB BB YY YY EE EE\n");
printf("\t\t\t BB BB YY YY EEEEEEEEEE BB BB YY YY EEEEEEEEEE\n");
printf("\t\t\t BB BB YY YY EE BB BB YY YY EE\n");
printf("\t\t\t BBBBBBBB YYYYYYYYY EEEEEEE BBBBBBBB YYYYYYYYY EEEEEEE\n");
printf("\t\t\t YY YY\n");
printf("\t\t\t YY YY\n");
printf("\t\t\t YY YY\n");
printf("\t\t\t YYYYYYYY YYYYYYYY\033[0m\n\n\n\n\n\n");
printf("\033[32m\t\t\t\t\t\t\t\t\t\t 謝謝使用!再見!\033[0m\n");
for(i=0;i<10;i++)
printf("\n");
}
void table2()//---------------------功能選擇菜單
{
printf("\033[2J\033[38A\n");
printf("\n\n\n\n\t\t\033[33m ************************愛****國****求****是****奮****進**********************\n");
printf("\t\t*************************歡****迎****進****入***OURS***圖****書****管****理****系****統*************************\n");
printf("\t\t ************************西****安****郵****電****大****學**********************\n");
printf("\n\n\n");
printf("\t\t\t\t\033[32m+\t\t『
1』--------------------------------#*******讀取資訊*******#\n");
printf("\n");
printf("\t\t\t\t+\t\t『
2』--------------------------------#*******存儲資訊*******#\n");
printf("\n");
printf("\t\t\t\t+\t\t『
3』--------------------------------#*******統計資訊*******#\n");
printf("\n");
printf("\t\t\t\t+\t\t『
4』--------------------------------#******按書名檢索******#\n");
printf("\n");
printf("\t\t\t\t+\t\t『
5』--------------------------------#******按編号檢索******#\n");
printf("\n");
printf("\t\t\t\t+\t\t『
6』--------------------------------#*****修改書刊資訊*****#\n");
printf("\n");
printf("\t\t\t\t+\t\t『
7』--------------------------------#*****列印書刊資訊*****#\n");
printf("\n");
printf("\t\t\t\t+\t\t『
8』--------------------------------#*****添加書刊資訊*****#\n");
printf("\n");
printf("\t\t\t\t+\t\t『
9』--------------------------------#*****删除書刊資訊*****#\n");
printf("\n");
printf("\t\t\t\t+\t\t『10』--------------------------------#*****建立新資料庫*****#\n");
printf("\n");
printf("\t\t\t\t+\t\t『11』--------------------------------#**按借閱剩餘數量排序**#\n");
printf("\n");
printf("\t\t\t\t+\t\t『12』--------------------------------#**按編碼小到大序排序**#\n");
printf("\n");
printf("\t\t\t\t\033[31m+\t\t『
0』--------------------------------#*******結束退出*******#\033[0m\n\n\n");
}
typedef struct book//----------------------書刊結構體類型
{ long num;//書刊編碼
char name[21];//書名
char author[21];//作者
char kind[21];//種類
char press[21];//出版社
int quantity;//所剩數量
struct book *next;
}sb;
sb *creat(void)//-------------------------資訊錄入
{ sb *p1,*p2,*head;
head=p2=(sb*)malloc(T);
printf("\033[32mPlease input: number, name, author, kind, press and
quantity(input 0 end)\n");
p1=(sb*)malloc(T);
scanf(SC);
while(p1->num!=0)
{ p2->next=p1;
p2=p1;
p1=(sb*)malloc(T);
scanf(SC);
}
p2->next=NULL;
free(p1);
printf("\033[0m");
return head;
}
sb *namefind(sb *p1)//----------------------按書名查找
{ char name[21];
printf("\n\n\n\n\n\033[33m->->檢索系統---按書名查找 ~~愛國~~求是~~奮進~~\n");
printf("------------------------------------------------------------------------------\033[0m\n\n\n");
printf("\033[31m請輸入您要查找的書名:");
scanf("%s",name);
printf("\033[0m");
while(p1->next!=NULL)
{ p1=p1->next;
if(strcmp(p1->name,name)==0) return p1;
}
return NULL;
}
sb *numberfind(sb *p2)//--------------------按編碼查找
{ long num;
printf("\n\n\n\n\n\033[33m->->檢索系統---按編碼查找 ~~愛國~~求是~~奮進~~\n");
printf("------------------------------------------------------------------------------\033[0m\n\n\n");
printf("\033[31m請輸入您要查找書刊的編碼:");
scanf("%ld",&num);
printf("\033[0m");
while(p2->next!=NULL)
{ p2=p2->next;
if(p2->num==num) return p2;
}
return NULL;
}
int delete(sb *q)//---------------------資訊删除
{ long num;
sb *p;
printf("\n\n\n\n\n\033[33m->->删除系統 ~~愛國~~求是~~奮進~~\n");
printf("------------------------------------------------------------------------------\033[0m\n\n\n");
p=q->next;
if(p==NULL) return 0;
printf("\033[31m請輸入您要删除書刊的編碼:");
scanf("%ld",&num);
printf("\033[0m");
while(p!=NULL)
{ if(p->num==num)
{ q->next=p->next;
free(p);
return 1;
}
q=p;
p=p->next;
}
return 0;
}
int insert(sb *q)//-------------------------資訊插入
{ sb *p;
p=(sb *)malloc(T);
printf("\n\n\n\n\n\033[33m->->插入系統 ~~愛國~~求是~~奮進~~\n");
printf("------------------------------------------------------------------------------\033[0m\n\n\n");
printf("\033[31mPlease input: number, name, author, kind, press and
quantity\n");
scanf("%ld %s %s %s %s
%d",&p->num,p->name,p->author,p->kind,p->press,&p->quantity);
printf("\033[0m");
while(q->next!=NULL&&q->next->num!=p->num)
q=q->next;
if(q->next!=NULL&&q->next->num==p->num||p->num==0)
{ free(p);
return 0;
}
p->next=q->next;
q->next=p;
return 1;
}
int alter(sb *head)//-----------------------資訊修改
{ sb *p;
long numb;
char c;
int i;
printf("\n\n\n\n\n\033[33m->->修改系統 ~~愛國~~求是~~奮進~~\n");
printf("------------------------------------------------------------------------------\033[0m\n\n\n");
while(1)
{ p=head;
p=p->next;
printf("\033[32m輸入要修改書刊編碼:");
scanf("%ld",&numb);
printf("\033[0m");
while(p!=NULL&&p->num!=numb)
p=p->next;
if(numb==0)
printf("\033[31m對不起,書刊編碼不能為0!\033[0m\n");
else if(p!=NULL&&p->num==numb&&numb!=0)
{ printf("\033[33m選擇要修改的項目(\033[31m1--編碼,2--書名,3--作者,4--種類,5--出版社,6--所剩數目):");
scanf("%d",&i);
printf("\033[0m");
getchar();
switch(i)
{ case 1:printf("\033[33m輸入修改後的編碼:");
scanf("%ld",&p->num);
printf("\033[32m修改成功!\033[0m\n"); break;
case 2:printf("\033[33m輸入修改後的書名:");
scanf("%s",p->name);
printf("\033[32m修改成功!\033[0m\n"); break;
case 3:printf("\033[33m輸入修改後的作者:");
scanf("%s",p->author);
printf("\033[32m修改成功!\033[0m\n"); break;
case 4:printf("\033[33m輸入修改後的種類:");
scanf("%s",p->kind);
printf("\033[32m修改成功!\033[0m\n"); break;
case 5:printf("\033[33m輸入修改後的出版社:");
scanf("%s",p->press);
printf("\033[32m修改成功!\033[0m\n"); break;
case 6:printf("\033[33m輸入修改後的所剩數目:");
scanf("%d",&p->quantity);
printf("\033[32m修改成功!\033[0m\n"); break;
default:printf("\033[31m您的選擇有誤,請重選!\033[0m\n\n"); break;
}
}
else printf("\033[31m對不起,沒有該書刊資訊!\033[0m\n\n");
getchar();
printf("\033[33m是否繼續修改('y' or 'n'):");
scanf("%c",&c);
printf("\033[0m");
if(c=='n'||c=='N') break;
}
}
int output(sb *p)//--------------------------列印書刊資訊
{ int i=1;
if(p==NULL||p->next==NULL)
{ printf("\033[31m沒有資訊,無法列印!\n");
return 0;
}
p=p->next;
while(p!=NULL)
{ if(!(i%2-0)&&(p->quantity-0))
{ printf(PR11);
i++;
p=p->next;
}
else if((i%2-0)&&(p->quantity-0))
{ printf(PR21);
i++;
p=p->next;
}
else if(!(i%2-0)&&!(p->quantity-0))
{ printf(PR12);
i++;
p=p->next;
}
else if((i%2-0)&&!(p->quantity-0))
{ printf(PR22);
i++;
p=p->next;
}
}
}
void sort1(sb *head)//-------------------------按借閱剩餘數量排序排序
{ sb *p,*p1,*p2;
printf("\n\n\n\n\n\033[33m->->排序系統---按借閱剩餘量大到小 ~~愛國~~求是~~奮進~~\n");
printf("------------------------------------------------------------------------------\033[0m\n\n\n");
p=p1=head->next;
p1=p1->next;
p->next=NULL;
if(head==NULL||head->next==NULL)
{ printf("\033[31m沒有資訊,無法排序!\033[0m\n");
return;
}
while(p1!=NULL)
{ p2=p1->next;
p=head;
while(p->next!=NULL&&p->next->quantity>p1->quantity)
p=p->next;
p1->next=p->next;
p->next=p1;
p1=p2;
}
printf("\033[32m排序成功!\033[0m\n");
}
void sort2(sb *head)//-----------------------按編碼排序
{ sb *p,*p1,*p2;
printf("\n\n\n\n\n\033[33m->->排序系統---按編碼有小到大 ~~愛國~~求是~~奮進~~\n");
printf("------------------------------------------------------------------------------\033[0m\n\n\n");
p=p1=head->next;
p1=p1->next;
p->next=NULL;
if(head==NULL||head->next==NULL)
{ printf("\033[31m沒有資訊,無法排序!\033[0m\n");
return;
}
while(p1!=NULL)
{ p2=p1->next;
p=head;
while(p->next!=NULL&&p->next->numnum)
p=p->next;
p1->next=p->next;
p->next=p1;
p1=p2;
}
printf("\033[32m排序成功!\033[0m\n");
}
void count(sb *p)//--------------------------資訊統計
{ int l=0;
printf("\n\n\n\n\n\033[33m->->統計系統 ~~愛國~~求是~~奮進~~\n");
printf("------------------------------------------------------------------------------\033[0m\n\n\n");
p=p->next;
while(p!=NULL)
{ l++;
p=p->next;
}
printf("\033[32m一共存儲有%d個書刊資訊!\n",l);
}
void store(sb *p)//-------------------------資訊存儲
{ FILE *fp;
char file1[40];
printf("\n\n\n\n\n\033[33m->->存儲系統 ~~愛國~~求是~~奮進~~\n");
printf("------------------------------------------------------------------------------\033[0m\n\n\n");
getchar();
printf("\033[33m請輸入檔案存儲路徑:");
scanf("%s",file1);
printf("\033[0m");
fp=fopen(file1,"wt");
if(p==NULL)
{ printf("\033[31m沒有資訊,無法儲存!\033[0m\n");
fclose(fp);
return;
}
while(p->next!=NULL)
{ p=p->next;
fwrite(p,T,1,fp);
}
fclose(fp);
printf("\033[32m資訊存儲成功!\033[0m\n");
}
sb *read()//------------------------------------讀取資料
{ sb *p1,*p2,*head;
FILE *fp;
char file2[40];
printf("\n\n\n\n\n\033[33m->->讀取系統 ~~愛國~~求是~~奮進~~\n");
printf("------------------------------------------------------------------------------\033[0m\n\n\n");
getchar();
printf("\033[33m請輸入檔案位址:");
scanf("%s",file2);
printf("\033[0m");
if((fp=fopen(file2,"rt"))==NULL)
{ printf("\033[31m檔案不存在!\033[0m\n");
// if(head->next==NULL) printf("\033[31m檔案資訊不存在!\033[0m\n");
}
else
{ head=p2=(sb *)malloc(T);
while(1)
{ p1=(sb *)malloc(T);
if(fread(p1,T,1,fp)!=1) break;
p2->next=p1;
p2=p1;
}
p2->next=NULL;
fclose(fp);
printf("\033[32m資訊讀取成功!\033[0m\n");
}
return head;
}
sb *build()//---------------------------建立新資料庫
{ sb *head;
char m;
printf("\n\n\n\n\n\033[33m->->錄入系統 ~~愛國~~求是~~奮進~~\n");
printf("------------------------------------------------------------------------------\033[0m\n\n\n");
getchar();
printf("\033[31m新資料庫會覆寫原資料,請謹慎選擇!否則後果自負!是否繼續:('Y' or 'N'):");
scanf("%c",&m);
if(m=='N'||m=='n') return 0;
else if(m=='Y'||m=='y')
return(head=creat());
}
int switchh(sb *p,sb
*head)//-------------------------主函數功能選擇
{ int n;
printf("\033[33m\t\t\t\t+\t\t\t\t請選擇您需要的功能:");
scanf("%d",&n);
printf("\033[0m");
while(n!=0)
{
switch(n)
{
case 1:printf("\033[2J\033[40A");
head=read();
break;
case 2:printf("\033[2J\033[40A");
store(head);
break;
case 3:printf("\033[2J\033[40A");
count(head);
break;
case 4:printf("\033[2J\033[40A");
p=namefind(head);
if(p) { printf(PR);
if(p->quantity!=0)
printf(PR11);
else if(!(p->quantity-0))
printf(PR12);
}
else printf("\033[31m對不起,沒有該書刊!\033[0m\n");
break;
case 5:printf("\033[2J\033[40A");
p=numberfind(head);
if(p) { printf(PR);
if(p->quantity!=0)
printf(PR11);
else if(!(p->quantity-0))
printf(PR12);
}
else printf("\033[31m對不起,沒有該書刊!\033[0m\n");
break;
case 6:printf("\033[2J\033[40A");
alter(head);
break;
case 7:printf("\033[2J\033[40A");
printf("\n\n\n\n\n\033[33m->->列印系統 ~~愛國~~求是~~奮進~~\n");
printf("------------------------------------------------------------------------------\033[0m\n\n\n");
printf(PR);
output(head);
break;
case 8:printf("\033[2J\033[40A");
if(insert(head)) printf("\033[32m已成功插入!\033[0m\n");
else printf("\033[31m有重号或編碼錯誤,插入失敗!\033[0m\n");
break;
case 9:printf("\033[2J\033[40A");
if(delete(head)) printf("\033[32m已正确删除!\033[0m\n");
else
printf("\033[31m删除項不存在!\033[0m\n");
break;
case 10:printf("\033[2J\033[40A");
head=build();
break;
case 11:printf("\033[2J\033[40A");
sort1(head);
break;
case 12:printf("\033[2J\033[40A");
sort2(head);
break;
default:printf("\033[2J\033[40A");
printf("\033[33m輸入錯誤!請重新輸入!!!\033[31m T_T \033[0m\n");break;
}
getchar();
printf("\n\n\033[33m------------------------------------------------------------------------------\033[0m\n");
printf("\033[32m按"Enter"鍵傳回!");
getchar();
table2();
printf("\033[33m\t\t\t\t+\t\t\t\t請選擇您需要的功能:");
scanf("%d",&n);
printf("\033[0m");
}
}
int main(void)
{ char Z[N][9],M[N][7];
sb *head,*p;
int Q,i;
head=NULL;
table();
Q=password();
if(Q) return 0;
getchar();
getchar();
table2();
switchh(p,head);
end();
}