1. 程式人生 > >小型圖書管理系統

小型圖書管理系統

jpg 進行 分享圖片 image 小明 sig ++ 字典序排序 rfi

【問題描述】
小明同學特別喜歡買書看書。由於書較多,擺放雜亂,找起來非常麻煩。這學期小明同學上了數據結構與程序設計課後,決定改變這種狀況:用C開發一個小型圖書管理系統。系統中包含的圖書信息有:書名、作者、出版社、出版日期等。首先,圖書管理系統對已有的書(原始書庫,存放在一個文本文件中)按書名字典序進行(排序)擺放(即將原始無序的圖書信息文件生成一個有序的文件,即新書庫),以便查找。該管理系統可以對新書庫中圖書條目進行如下操作:
1.錄入。新增書錄入到書庫中(即從輸入中讀入一條圖書信息插入到已排序好的圖書文件相關位置處)
2.查找。按書名或書名中關鍵字信息在書庫中查找相關圖書信息,若有多本書,按字典序輸出。
3.刪除。輸入書名或書名中關鍵字信息,從書庫中查找到相關書並將其刪除,並更新書庫。
【輸入形式】
原始的圖書信息(原始書庫)保存在當前目錄下的books.txt中。
用戶操作從控制臺讀入,首先輸入操作功能序號(1代表錄入操作,2代表查找操作,3代表刪除操作,0代表將已更新的圖書信息保存到書庫中並退出程序),然後在下一行輸入相應的操作信息(錄入操作後要輸入一條圖書信息,查找和刪除操作後只要輸入書名或書名中部分信息)。程序支行過程中可以進行多次操作,直到退出(輸入操作0)程序。
要求:
1、原始文件中的圖書信息與錄入的圖書信息格式相同,每條圖書信息都在一行上,包括書名(不超過50個字符)、作者(不超過20個字符)、出版社(不超過30個字符)和出版日期(不超過10個字符),只由英文字母和下劃線組成,用一個空格分隔。圖書信息總條數不會超過500.
2、下劃線字符參加排序。
3、圖書不會重名。
【輸出形式】
進行錄入和刪除操作,系統會更新圖書信息,但不會在控制臺窗口顯示任何信息。
進行查找操作後,將在控制臺按書名字典序分行輸出查找到的圖書信息,書名占50個字符寬度,作者占20個字符寬度,出版社占30個字符寬度,出版日期占10個字符寬度,都靠左對齊輸出。
最終按字典排序的圖書信息保存在當前目錄下的ordered.txt中,每條圖書信息占一行,格式與查找輸出的圖書信息相同。
【樣例輸入】
假設books.txt中保存的原始圖書信息為:
The_C_programming_language Kernighan Prentice_Hall 1988
Programming_in_C Yin_Bao_Lin China_Machine_Press 2013
Data_structures_and_Algorithm_Analysis_in_C Mark_Allen_Weiss Addison_Wesley 1997
ANSI_and_ISO_Standard_c Plauger Microsoft_Press 1992
Data_structures_and_program_design_in_C Robert_Kruse Pearson_Education 1997
Computer_network_architectures Anton_Meijer Computer_Science_Press 1983
C_programming_guidelines Thomas_Plum Prentice_Hall 1984
Data_structures_using_C Tenenbaum Prentice_Hall 1990
Operating_system_concepts Peterson Addison_Wesley 1983
Computer_networks_and_internets Douglas_E_Come Electronic_Industry 2017
用戶控制臺輸入信息為:
1
Data_structures_and_C_programs Christopher Addison_Wesley 1988
2
structure
1
The_C_programming_tutor Leon_A_Wortman R_J_Brady 1984
2
rogram
3
rogramming
0
【樣例輸出】
用戶輸入“2 structure”後,控制臺輸出:

技術分享圖片

用戶輸入“2 rogram”後,控制臺輸出:

技術分享圖片

ordered.txt文件內容為:
技術分享圖片

【樣例說明】
先讀入books.txt中的10條圖書信息,按照書名進行字典序排序;用戶進行了五次操作,然後退出:第一次操作是插入了一條圖書信息,這時有11條圖書信息,按書名字典序排序為:
ANSI_and_ISO_Standard_c Plauger Microsoft_Press 1992
C_programming_guidelines Thomas_Plum Prentice_Hall 1984
Computer_network_architectures Anton_Meijer Computer_Science_Press 1983
Computer_networks_and_internets Douglas_E_Come Electronic_Industry 2017
Data_structures_and_Algorithm_Analysis_in_C Mark_Allen_Weiss Addison_Wesley 1997
Data_structures_and_C_programs Christopher Addison_Wesley 1988
Data_structures_and_program_design_in_C Robert_Kruse Pearson_Education 1997
Data_structures_using_C Tenenbaum Prentice_Hall 1990
Operating_system_concepts Peterson Addison_Wesley 1983
Programming_in_C Yin_Bao_Lin China_Machine_Press 2013
The_C_programming_language Kernighan Prentice_Hall 1988
第二次操作是查找書名包含structure的圖書,有4本圖書信息按照格式要求輸出到屏幕;第三次操作又插入了一條圖書信息,這時有12條圖書信息;第四次操作查找書名包含rogram的圖書,有6本圖書信息按照格式要求輸出到屏幕;第五次操作是刪除書名包含rogramming的圖書信息,有三條圖書信息要刪除,剩下九條圖書信息;最後退出程序前將剩余的九條圖書信息按照格式要求存儲在ordered.txt文件中。

【題解】

  1 #include<stdio.h>
  2 #include<string.h>
  3 int read_file();
  4 void sort_book();
  5 void enter_book();
  6 void seek_book();
  7 void cancel_book();
  8 void save_file();
  9 int len;
 10 struct que
 11 {
 12     char name[55];
 13     char aut[25];
 14     char pub[35];
15 char date[15]; 16 }book[505],t,enter; 17 int main() 18 { 19 int n; 20 len=read_file(); 21 sort_book(); 22 while((scanf("%d",&n))!=EOF) 23 { 24 switch(n) 25 { 26 case 1: 27 enter_book(); 28 break; 29 case 2: 30 seek_book(); 31 break; 32 case 3: 33 cancel_book(); 34 break; 35 default: 36 break; 37 } 38 if(n==0) 39 break; 40 } 41 return 0; 42 } 43 int read_file() 44 { 45 FILE *fp; 46 int i=0; 47 if((fp=fopen("books.txt","r"))==NULL) 48 return 1; 49 while((fscanf(fp,"%s",book[i].name))!=EOF){ 50 fscanf(fp,"%s",book[i].aut); 51 fscanf(fp,"%s",book[i].pub); 52 fscanf(fp,"%s",book[i].date); 53 i++; 54 } 55 fclose(fp); 56 return i; 57 } 58 void sort_book() 59 { 60 int i,j; 61 for(i=0;i<len;i++) 62 for(j=0;j<len-1-i;j++) 63 if((strcmp(book[j].name,book[j+1].name))>0) 64 { 65 t=book[j]; 66 book[j]=book[j+1]; 67 book[j+1]=t; 68 } 69 save_file(); 70 return; 71 } 72 void enter_book() 73 { 74 scanf("%s %s %s %s",book[len].name,book[len].aut,book[len].pub,book[len].date); 75 len++; 76 sort_book(); 77 save_file(); 78 return; 79 } 80 void seek_book() 81 { 82 int i; 83 char name[55]; 84 scanf("%s",name); 85 for(i=0;i<len;i++) 86 if((strstr(book[i].name,name))!=NULL) 87 printf("%-50s%-20s%-30s%-10s\n",book[i].name,book[i].aut,book[i].pub,book[i].date); 88 save_file(); 89 return; 90 } 91 void cancel_book() 92 { 93 int i,j; 94 char name[55]; 95 scanf("%s",name); 96 for(i=0;i<len;i++) 97 if((strstr(book[i].name,name))!=NULL) 98 { 99 for(j=i;j<len;j++) 100 book[j]=book[j+1]; 101 len--; 102 i--; 103 } 104 save_file(); 105 return; 106 } 107 void save_file() 108 { 109 FILE *fp; 110 int i; 111 if((fp=fopen("ordered.txt","w"))==NULL) 112 return; 113 for(i=0;i<len;i++) 114 fprintf(fp,"%-50s%-20s%-30s%-10s\n",book[i].name,book[i].aut,book[i].pub,book[i].date); 115 fclose(fp); 116 return; 117 }

小型圖書管理系統