Linux大實驗 (圖書管理系統)

《程序設計基礎綜合實驗》講義

綜合實驗又稱爲課程設計,需要學生綜合運用所學知識解決與實際應用緊密結合的、規模較大的問題,通過分析、設計、編碼和調試等各環節的訓練,使學生深刻理解、牢固掌握、綜合運用數據結構和算法設計技術,增強分析問題、解決問題的能力,培養項目管理與團隊合作精神。
本課程要求實驗採用基本的軟件工程開發方法,將軟件開發過程分爲需求分析、系統設計、編碼實現、系統測試4個階段。每個階段設置相應的里程碑進行檢查,對學生的設計過程進行評價。
(1)需求分析階段
首先要充分分析和理解問題,明確要求做什麼?限制條件是什麼?即要確定需要實驗那些功能(任務),並對所需完成的任務做出明確的回答,如,輸入數據的類型、值的範圍及輸入的形式;輸出數據的類型、值的範圍及輸出的形式;若是會話式輸入,結束標誌是什麼?是否接受非法輸入?對非法輸入的回答方式是什麼等。另外,還應該爲調試程序準備好測試數據,包括合法的輸入數據與非法的輸入數據。同時,實驗小組應該對設計工作進行分工,並形成小組成員通過的書面記錄。
(2)概要設計和詳細設計階段
設計通常分爲概要設計與詳細設計兩步。
在進行概要設計時,確定數據的邏輯結構,並要求按照自頂向下逐步求精的原則劃分模塊,畫出模塊間的調用關係圖。
在進行詳細設計時,要求定義數據的存儲,並畫出各模塊(函數)的程序流程圖或寫出僞代碼。
(3)編碼實現階段
在詳細設計的基礎上,用特定的程序設計語言編寫程序。良好的程序設計風格可以保證較快地完成程序測試。程序的每行不要太長,每個函數不要太大,當一個函數太大時,可以考慮將其分解爲較小的函數。對函數功能、核心語句、重要的類型和變量等應給出註釋。一定要按凹入格式書寫程序,分清每條語句的凹入層次,上下對齊層次的括號,以便發現語法錯誤。
(4)測試階段
採用測試數據進行測試,列出實際的輸入、輸出結果、預期結果。
(5)總結與整理報告階段
調試正確後認真整理源程序及註釋,提交帶有完整註釋且格式良好的源程序,並撰寫課程設計報告。
課程設計報告中除了上面提到的分析、設計過程外,還用給出下面幾方面的內容。
① 調試分析:調試過程中主要遇到哪些問題?如何解決的?
② 算法分析:核心算法的時間複雜性與空間複雜性分析。
③ 改進設想、經驗和體會。
一、圖書管理信息系統的設計與實現 (難度係數:1)
1.問題描述
圖書管理信息系統實現圖書館館藏圖書的信息管理與圖書借閱。圖書管理信息系統包括用戶管理、讀者管理、圖書管理、圖書流通功能。
2.整體要求
該系統應具有合理的界面設計,並易於操作;
編碼風格良好;
該系統用控制檯程序即可實現;
編程語言爲C語言,編程環境爲VC++ 6.0
3.設計要求
(1)登錄系統時,要求用戶輸入用戶名與密碼,用戶名與密碼無誤方可使用系統,最多可以嘗試三次。用戶分爲:普通讀者、圖書管理員、系統管理員三種。普通讀者只能使用“用戶管理子系統”中“用戶密碼修改”功能和“圖書管理子系統”中“圖書信息查詢”功能;圖書管理員只能使用“圖書管理子系統”和“圖書流通管理子系統”;系統管理員只能使用“用戶管理子系統”和“讀者管理子系統”。
(2)圖書管理信息系統包括:用戶管理、讀者管理、圖書管理、圖書流通管理這四個子系統。“圖書管理信息系統”主菜單要求包含如下選項:
**********************************
1.用戶管理
2.讀者管理
3.圖書管理
4.圖書流通管理
5.退出系統


  要求在選擇退出功能之前,可以反覆選擇系統的各項功能使用系統。

1)用戶管理子系統:
應包括用戶信息輸入、用戶信息修改、用戶信息刪除、用戶信息顯示、用戶密碼修改等功能。其中“普通讀者”只能使用“用戶密碼修改”功能。
“用戶管理”菜單要求包括如下選項:


  1. 用戶信息輸入
  2. 用戶信息修改
  1. 用戶信息刪除
  2. 用戶信息顯示
  3. 用戶密碼修改
  4. 返回主菜單

“用戶管理子系統”要求用文件與鏈表實現。
2)讀者管理子系統:
應包括讀者信息輸入、讀者信息修改、讀者信息刪除、讀者信息按名查詢等功能。
“讀者管理”菜單要求包括如下選項:


      1. 讀者信息輸入
      2. 讀者信息修改
      3. 讀者信息刪除
      4. 讀者信息查詢
      5. 讀者信息顯示(按讀者姓氏排序)
      6. 返回主菜單
   *******************
 “讀者管理子系統”要求用文件與鏈表實現。

3)圖書管理子系統:
至少應包括圖書信息輸入、圖書信息修改、圖書信息查詢、彙總統計等功能。其它功能(如圖書訂閱、圖書編目、新書通報等功能)可根據自身情況酌情實現。
“圖書管理”菜單至少要求包括如下選項:


      1. 圖書信息輸入
      2. 圖書信息修改
      3. 圖書信息查詢
      4. 彙總統計
      5. 返回主菜單
   *******************

普通用戶只能使用其中的圖書信息查詢和圖書數目統計功能(功能3和功能4),當普通用選擇其它功能時應告知不能使用。
如果在“圖書管理”的菜單中選擇了“3. 圖書信息查詢”,系統應提示如下子菜單:


   1. 按書號查詢
   2. 按書名查詢
   3. 按作者查詢
   4. 按出版社查詢
   5. 返回主菜單
  *******************

“圖書管理子系統”要求用文件和順序表實現。
4)圖書流通管理子系統:
至少應包括借書處理和還書處理功能。其它功能(如預約處理、逾期處理等功能)可根據自身情況酌情實現。普通用戶只能使用預約處理功能。
“圖書管流通理”菜單至少要求包括如下選項:


   1. 借書處理
   2. 還書處理
   3. 返回主菜單
  *******************

“圖書流通管理子系統”要求用文件和順序表實現。
(3)要求建立如下文件:
1)建立用戶文件,包括用戶的如下信息:
用戶名(可用讀者號)、用戶密碼、用戶類型
用戶類型可分爲:管理員和普通用戶。管理員可以使用系統的所有功能,普通用戶只可以查詢圖書及借閱情況。
2)建立讀者文件,包括讀者的如下信息:
讀者號、讀者名、單位、聯繫方式、可借書數、已借書數
3)建立與圖書有關的如下文件。
圖書主文件,包括圖書的如下信息:
記錄號、書號、書名、作者、出版社、藏書量、借出數、指針1、指針2、
指針3
圖書主文件可以按主關鍵字(書號)有序或無序。
書號(主關鍵字)索引表,必須按書號有序。該索引表包括如下信息:
書號、該書號對應記錄在主文件中記錄號
書名(次關鍵字)索引表,包括如下信息:
書名、鏈頭指針、長度
作者(次關鍵字)索引表,包括如下信息:
作者、鏈頭指針、長度
出版社(次關鍵字)索引表,包括如下信息:
出版社、鏈頭指針、長度
圖書主文件和三個次關鍵字索引表的樣例分別如表1至表4所示。
表1 圖書主文件
記錄號 書號 書名 作者 出版社 藏書量 借出數 指針1 指針2 指針3
1 1021 數據庫 楊豔 人民郵電 10 8 0 0 0
2 1014 數據結構 趙鵬 高等教育 9 7 0 0 0
3 1106 操作系統 金虎 人民郵電 8 6 0 0 1
4 1108 數據結構 高揚 清華大學 7 5 2 0 0
5 1203 程序設計 楊豔 高等教育 9 4 0 1 2
6 2105 數據庫 金虎 清華大學 7 3 1 3 4
7 1012 數據結構 楊豔 人民郵電 8 2 4 5 3
8 0109 程序設計 趙鵬 清華大學 9 1 5 2 6
表2 書名次關鍵字索引表
書名 鏈頭指針 長度
數據庫 6 2
數據結構 7 3
操作系統 3 1
程序設計 8 2
表3 作者次關鍵字索引表
作者 鏈頭指針 長度
楊豔 7 3
趙鵬 8 2
金虎 6 2
高揚 4 1
表4 出版社次關鍵字索引表
出版社 鏈頭指針 長度
人民郵電 7 3
高等教育 5 2
清華大學 8 3
4)建立借還書文件,包括如下信息:
讀者號、書號、借書日期、還書日期
4.設計思想
下面將給出一些核心算法的設計思想。
(1)“登錄系統”算法的設計思想
打開“用戶文件”,讀入文件內容,建立相應的鏈表。請用戶輸入用戶名及密碼。若用戶名或密碼輸入不正確,最多允許嘗試三次。用戶名與密碼輸入正確時,記住當前用戶類型。
當該用戶爲圖書管理員時,打開“圖書主文件”及所有的“索引表文件”,分別將文件內容讀入相應的一維數組中,打開“借還書文件”,建立相應的鏈表,打開“讀者文件”,建立相應的鏈表;當該用戶爲系統管理員時,打開“讀者文件”,讀入文件內容,建立相應的鏈表;當該用戶爲普通讀者時,打開圖書主文件及所有的索引表文件,分別將文件內容讀入相應的一維數組中,並關閉所有打開的文件。
普通讀者只能選“用戶管理”功能項中“用戶密碼修改”子功能和“圖書管理”功能項中“圖書信息查詢”子功能;圖書管理員只能選“圖書管理”和“圖書流通管理”功能項;系統管理員只能選“用戶管理”和“讀者管理”功能項。需要根據用戶類型顯示相應的菜單,請用戶選擇功能項。
當退出系統時,需將各個鏈表和數組中的內容寫回相應的文件。
(2)“圖書信息輸入”算法的設計思想
在輸入圖書信息時建立圖書主文件,在圖書主文件中記錄號從1開始。根據設計要求,在建立圖書文件的同時,需要建立一個主關鍵字(書號)索引表。索引表按書號升序排列(用插入排序法),索引表可以先在內存中用一維數組實現,最後再將相應內容一併寫入(外存)文件。
根據設計要求,圖書文件除了主關鍵字(書號)索引表外,還需要建立書名、作者、出版社三個次關鍵字索引表。次關鍵字索引表可採用頭插法建立,具體做法是:根據一個主文件的記錄,將要建立索引的次關鍵字與對應的次關鍵字索引表中的次關鍵字(如書名、作者、出版社)進行比較,若有相等的,就將主文件中的相應指針修改爲索引表中的當前鏈頭指針,並修改相應索引表中的鏈頭指針爲當前主文件的記錄指針(即記錄號),同時將長度加1;若沒有相等的,就將主文件中的相應指針置爲0,並在相應次關鍵字索引表中增加與該次關鍵字相關的一條記錄,該記錄的鏈頭指針置爲當前主文件的記錄號,而將長度置爲1。
(3)“圖書信息查詢”算法的設計思想
按書號查詢時,由於圖書文件已按書號建立了索引表,該索引表是按書號有序的,因此,在該索引表中可採用二分查找算法。
按書名查詢時,先順序查找書名次關鍵字索引表,找到相應的書名,取到該書名鏈頭指針後,再回到圖書主文件中順鏈依次找出所有具有該書名的書。
按作者和出版社查詢時,與按書名查詢方法類似。
(4)“借書處理”算法設計思想
圖書管理員輸入讀者號、書號、借書日期。系統檢查讀者是否爲合法讀者,若不是,顯示提示信息,並返回;若是,則進一步檢查讀者借書數量是否超出限額。若超出,給出提示信息,並返回;若未超出,檢查書號是否合法,若書號非法,給出提示信息,並返回;否則,繼續檢查該號圖書是否已全部借出,若是,給出提示信息,並返回,否則,將借書文件記錄數加1,借書文件追加1條相關記錄,讀者借書數加1,圖書借出數加1,並提示借書成功。
(5)“還書處理”算法設計思想
圖書管理員輸入讀者號、書號、還書日期。系統根據讀者文件檢查讀者是否爲合法讀者,若不是合法讀者,顯示提示信息,並返回。否則,在借還書文件中檢查書號是否合法,若書號非法,給出提示信息,並返回。否則,在圖書文件中再檢查書號是否合法,若非法,給出提示信息,並返回。否則,在“讀者文件”中將該讀者的借書數減1,在“圖書文件”中修改借出數,在“借還書文件”中填入還書日期。
5.評價標準
本設計是一個比較綜合的練習,用到順序表、鏈表、靜態鏈表、文件、排序、查找、字符串操作等方面的知識。本課程的主要目的是培養學生的綜合設計能力、編程與調試能力,以及團隊合作能力。因此要求本項目必須是團隊合作完成的,程序必須能夠正確運行,具體評分標準如表5所示。
表5 評分表
項目 所佔分值 得分依據 得分
登錄系統 10 使用“用戶名”與“密碼”登錄系統,根據用戶類
型打開相關文件,建立相應的鏈表或數組。
顯示主菜單,並根據用戶類型正確實現主菜單各個選項的跳轉功能。
用戶管理 15 子系統菜單(2分)
用戶信息輸入(2分)
用戶信息修改(2分)
用戶信息刪除(2分)
用戶信息顯示(2分)
用戶密碼修改(2分)
完成質量與速度(3分)
讀者管理 15 子系統菜單(2分)
讀者信息輸入(2分)
讀者信息修改(2分)
讀者信息刪除(2分)
讀者信息查詢(2分)
讀者信息顯示(2分)
完成質量與速度(3分)
圖書管理 20 子系統菜單(2分)
圖書信息輸入(2分)
圖書信息修改(2分)
圖書信息查詢功能共9分,其中:
查詢子菜單(1分)
按書號查詢(2分)
按書名查詢(2分)
按作者查詢(2分)
按出版社查詢(2分)
彙總統計(2分)
完成質量與速度(3分)
圖書流通管理 10 子系統菜單(2分)
借書處理(3分)
還書處理(3分)
完成質量與速度(2分)
總體表現 10 根據完成附加功能情況、系統總體運行情況、完成的質量(包括算法的正確性、算法的複雜性、容錯性、用戶友好等因素)、團隊合作情況等酌情加分。
曠課1次扣3分,缺勤1次扣1分。
報告 20
總分 100

二、銀行卡管理系統(難度係數0.9)

  1. 需求分析
    隨着社會經濟的發展,信息化程度的不斷深入,銀行的傳統業務己愈來愈不能滿足銀行客戶的需要。
    現今,人們的金融意識、科技意識己經有了很大的提高,在緊張忙碌的生活中,己越來越來不習慣每月奔忙於各銀行營業櫃檯之問去排隊繳各種各樣的費用了;同時,各種經營單位如電信、移動、供電、煤氣、自來水、證券等等一是爲了提高服務質量、方便客戶,二是爲了減輕自己日趨繁重的工作量,紛紛委託銀行爲其開展代收代付業務:同時,隨着我國加入世貿組織的日益臨近,我國的銀行業將面臨更加激烈的同業競爭,如何提供更多的金融產品和更優質的服務,如何吸引更多的客戶,如何利用計算機技術加強銀行帳戶信息管理、進行銀行業務再造,提高銀行的工作效率和業務竟爭能力是擺在各家銀行面前的一個迫切需要解訣的問題。
  2. 問題描述
    近幾年來,各商業銀行加快了與社會各業的合作,利用自身的網點優勢和業務特點,爲其提供各種高效、快捷的代收代付業務,也就是中間代理業務,目前以與廣大人民羣衆生活密切相關的各項繳費業務如水電費、電話費、手機費等代收業務爲主,這些業務開展方式多種多樣,但一般都離不開計算機的高效管理支持。
    隨着代理業務不斷髮展,業務品種越來越多,各項業務做法互有差異,這就對銀行的電子化水平和相應的管理水平提出了更高的要求。如何利用電子化的手段構建一個高效統一的、通用靈活的系統來管理各種各樣的業務,是每個商業銀行所要研究的課題。支持決策系統的,需要在數據庫的基礎上,進行聯機分析處理,每次處理的數據量大,響應時間長。特別是銀行每天要處理大量的存取款事件,做好存取款是銀行工作重要的環節,然而要有效處理必須要有良好的程序和數據管理系統來建立一個良好的軟件系統來實現快速、有效、準確、安全的處理銀行事物。
  3. 基本要求
    (1)開戶:創建一個新的賬戶,接受用戶輸入的身份證號,以及賬戶密碼,判斷用戶輸入的身份證號是否唯一且賬戶密碼是否符合要求,如驗證成功則爲該用戶生成一個唯一的帳號。
    (2)存款:在用戶輸入正確的帳號和密碼的情況下,接受用戶輸入的存款金額,並對該帳號的存款信息進行更新。
    (3)取款:在用戶輸入正確的帳號和密碼的情況下,接受用戶輸入的取款金額。取款金額不應該大於當前帳號存款金額,當取款金額不大於當前帳號存款金額時,執行取款操作,並對該帳戶的存款信息進行更新。
    (4)掛失:在用戶輸入正確的帳號和密碼的情況下,接受用戶掛失操作。當帳號掛失後,與該帳號相關的操作都將被禁止。
    (5)銷戶:在用戶輸入正確的帳號和密碼的情況下,接受用戶銷戶。當用戶銷戶後,該帳號將被永久刪除。
    (6)轉帳:在用戶輸入正確的帳號和密碼的情況下,接受用戶轉賬操作,轉帳金額不應該大於當前帳號存款金額,當轉帳金額不大於當前帳號存款金額時,執行轉帳操作,並對該帳戶的存款信息及轉帳的接受賬戶的存款信息進行更新。
    (7)修改賬戶密碼:在用戶輸入正確的帳號和密碼的情況下,接受用戶修改密碼操作,用戶輸入的原密碼,若用戶輸入的密碼與原密碼匹配,則接受用戶輸入的新密碼,若用戶兩個輸入的密碼相同,則修改賬戶密碼,並對數據文件進行更新操作。
    (8)查看餘額:在用戶輸入正確的帳號和密碼的情況下,接受用戶查看餘額操作,該模塊只涉及數據查詢,並不涉及數據文件更新操作。
    (9)查看用戶交易歷史:在用戶輸入正確的帳號和密碼的情況下,接受用戶查看用戶交易歷史操作,系統將顯示當前賬戶的最近的存、取款操作記錄,該模塊只涉及數據查詢,並不涉及數據文件更新操作。
  4. 數據結構
    完成本程序需要兩個結構體來存儲相應的信息,並且所以信息最終保存在文件中。
    銀行卡基本信息結構:
    卡號:16位數字構成的字符串,前12位表示開戶行、城市、網點等信息,後4位代表序號。
    姓名:持卡人姓名,長度爲13的字符串。
    密碼:字符+數字,不得少於6位。
    餘額:doube類型。
    標記:short類型,0 表示正常,1 表示註銷,2 表示凍結(注:如爲1或2,該卡不能進行正常操作)。
    交易記錄信息結構:
    卡號:與上面相同。
    交易日期:10位字符串,例如2017-03-01。
    交易金額:double類型。
    標記:short類型,0代表存款,1代表取款,2代表轉賬。
    對方卡號:與卡號說明相同,如標記爲0或1,此項爲空。
  5. 程序模塊說明
    本系統採用結構化,自頂向下的設計思想實現。具體各個模塊功能說明如下:
    第一個模塊——主函數main()的功能是:根據菜單單的選項調用各函數,並完成相應的功能。
    第二個模塊——oaccount()的功能是:用戶開戶信息將存入文件中。
    第三個模塊——saving()的功能是:存款函數的實現。
    第四個模塊——withdraw()的功能是:取款功能的實現。
    第五個模塊——transfer()的功能是:轉帳功能的實現。
    第六個模塊——changemima()的功能是:修改密碼的功能實現。
    第七個模塊——serach()的功能是:查詢餘額的功能實現。
    第八個模塊——guashi()的功能是:掛失(銀行卡凍結)功能的實現。
    第九個模塊——Tradejilu()的功能是:查詢交易記錄的功能實現。
    第十個模塊——delete()的功能:刪除銀行卡信息的實現(要求用鏈表實現)。
    第十一個模塊——welcome()的功能是:界面進入的功能實現。
    除主函數外,其他函數都通過welcome函數連接。
  6. 測試與分析
    系統運行參考界面
    歡迎界面:

管理登錄操作主界面:

用戶功能選擇界面:

三、學生信息管理系統模擬 (難度係數0.8)

  1. 整體要求
    該系統應具有合理的界面設計,並易於操作;
    編碼風格良好;
    該系統用控制檯程序即可實現;
    編程語言爲C語言,編程環境爲VC++ 6.0。

  2. 存儲結構設計
    設計學生結構體。

  3. 編程要求
    (1)結構體設計
    “學生”結構體包含“學號”、“姓名”、“性別”、“英語成績”、“C語言成績”。
    (2)存儲結構要求
    學生信息要求保存到文件中。

  4. 菜單(界面)設計
    編程實現系統的整體菜單
    “登陸”菜單(選做,有加分)
    1----------用戶登陸
    0----------退出系統
    主菜單樣式如下:
    1----------學生錄入
    2----------學生瀏覽
    3----------學生查詢
    4----------學生刪除
    5----------成績統計
    0----------退出系統

  5. 功能和函數設計
    任務
    通過函數完成各個菜單模塊的功能,要求合理設計主函數和各個子函數,合理設計各個函數之間的調用關係。
    編程要求
    1.主函數:顯示主菜單。
    2.如果設計並編寫登陸菜單,要求合理設計登陸界面,要求用戶輸入用戶名和密碼,如果全都正確則進入主菜單,如果有一項不對,系統再提供兩次機會輸入,三次都錯退出系統。(此部分有加分)
    3.編寫函數完成“學生錄入”功能,要求能將用戶由鍵盤輸入的若干學生信息追加到student.txt或student.dat中,存儲結構可以使用數組,也可以使用鏈表。
    4.編寫函數完成“學生瀏覽”功能,要求能將student.txt或student.dat文件中的全部學生信息顯示出來,存儲結構可以使用數組,也可以使用鏈表。
    5.編寫函數完成“學生查詢”功能,要求能按照學號或姓名對學生進行查詢。
    6.編寫函數完成“學生刪除”功能,要求按照學號或姓名將某個學生刪除,並將刪除後的結果寫回到文件中,此功能要求存儲結構必須使用鏈表。
    7.設計並編寫編寫函數完成“成績統計”功能,可以對“英語成績”、“C語言成績”進行單科瀏覽(降序排列),按某個學生統計總分和平均分,按英語和C語言兩科成績對學生進行排序。

user.h

#ifndef USER_H
#define USER_H
#include<string>
using namespace std;
class user
{
	public:
		user();
		~user();
		user(char *u,char *p,char *n,char *w,long t,int a,int h);
		void set(char *u,char *p,char *n,char *w,long t,int a,int h);
		void setvalue(char *u,char *p,char *n,char *w,long t,int a,int h);
		void delete_();
		void mdf_s();
		void show();
		void mdf_pw();
		char* getname();
		char* getpw();
		char* rname();
		char* getwp();
		long gettel();
		int geta();
		int geth();
        void query();
        bool operator<(user a);
        void sortshow();
	protected:
		char user_name[20];
		char password[10];
		char name[10];
		char workplace[20];
		long tel;
		int ableb,hadb;
};

#endif

user.cpp

#include "user.h"
#include<string.h>
#include<iostream>
#include<fstream>
#include<list>
bool scmp(char *a,char *b);
using namespace std;
user::user()  //
{
	memset(user_name,0,sizeof(user_name));
	memset(password,0,sizeof(password));
	memset(name,0,sizeof(name));
	memset(workplace,0,sizeof(workplace));
	tel=0;
	ableb=0;
	hadb=0;
}

user::user(char *u,char *p,char *n,char *w,long t,int a,int h) //
{
	memset(user_name,0,sizeof(user_name));
	memset(password,0,sizeof(password));
	memset(name,0,sizeof(name));
	memset(workplace,0,sizeof(workplace));
	for(int i=0;i<strlen(u);i++)
	user_name[i]=u[i];
	for(int i=0;i<strlen(p);i++)
	password[i]=p[i];
	for(int i=0;i<strlen(n);i++)
	name[i]=n[i];
	for(int i=0;i<strlen(w);i++)
	workplace[i]=w[i];
	tel=t;
	ableb=a;
	hadb=h;
}
void user::set(char *u,char *p,char *n,char *w,long t,int a,int h) //
{
	memset(user_name,0,sizeof(user_name));
	memset(password,0,sizeof(password));
	memset(name,0,sizeof(name));
	memset(workplace,0,sizeof(workplace));
	for(int i=0;i<strlen(u);i++)
	user_name[i]=u[i];
	for(int i=0;i<strlen(p);i++)
	password[i]=p[i];
	for(int i=0;i<strlen(n);i++)
	name[i]=n[i];
	for(int i=0;i<strlen(w);i++)
	workplace[i]=w[i];
	tel=t;
	ableb=a;
	hadb=h;
}
void user::delete_() //
{
	ifstream inf("user.txt",ios::in|ios::binary);
	inf.seekg(0,ios::end);
	int n=inf.tellg();
	n/=sizeof(user);
	inf.close();
	ifstream in("user.txt",ios::in|ios::binary);
	list<user> lt;
	ofstream out("user.txt",ios::out|ios::binary);
	while(n--)
	{
		user temp;
		in.read((char*)&temp,sizeof(user));
		if(scmp(this->getname(),temp.getname()) && scmp(this->getpw(),temp.getpw()))
		{
            cout<<"你的用戶信息已從文件裏刪除,改系統自動退出";
		}
		else lt.push_back(temp);
	}
	in.close();
	while(!lt.empty())
	{
		user temp(lt.front().getname(),lt.front().getpw(),lt.front().rname(),lt.front().getwp(),lt.front().gettel(),lt.front().geta(),lt.front().geth());
		out.write((char*)&temp,sizeof(user));
		lt.pop_front();
	}
	out.close();
}

void user::setvalue(char *u,char *p,char *n,char *w,long t,int a,int h) //
{
	ifstream inf("user.txt",ios::in|ios::binary);
	inf.seekg(0,ios::end);
	int ncnt=inf.tellg();
	ncnt/=sizeof(user);
	inf.close();
	ifstream in("user.txt",ios::in|ios::binary);
	list<user> lt;
	//cout<<ncnt<<endl;
	while(ncnt--)
	{
		user temp;
		in.read((char*)&temp,sizeof(user));
		if(scmp(this->getname(),temp.getname()) && scmp(this->getpw(),temp.getpw()))
		{
		    memset(user_name,0,sizeof(user_name));
            memset(password,0,sizeof(password));
	        memset(name,0,sizeof(name));
            memset(workplace,0,sizeof(workplace));
            for(int i=0;i<strlen(u);i++)
	        user_name[i]=u[i];
         	for(int i=0;i<strlen(p);i++)
        	password[i]=p[i];
        	for(int i=0;i<strlen(n);i++)
        	name[i]=n[i];
         	for(int i=0;i<strlen(w);i++)
	        workplace[i]=w[i];
        	tel=t;
	        ableb=a;
	        hadb=h;
	        temp.set(u,p,n,w,t,a,h);
		}
		lt.push_back(temp);
	}
	in.close();
	ofstream out("user.txt",ios::out|ios::binary);
	while(!lt.empty())
	{
	    user temp(lt.front().getname(),lt.front().getpw(),lt.front().rname(),lt.front().getwp(),lt.front().gettel(),lt.front().geta(),lt.front().geth());
		out.write((char*)&temp,sizeof(user));
		lt.pop_front();
	}
	out.close();
}

void user::mdf_pw() //
{
	cout<<"請輸入新密碼\n";
	char p[10],u[20],n[10],w[20];
	cin>>p;
	strcpy(u,this->getname());
	strcpy(n,this->rname());
	strcpy(w,this->getwp());
	setvalue(u,p,n,w,gettel(),geta(),geth());
    cout<<"你的密碼修改完畢\n";
}

void user::show() //
{
    cout<<"讀者"<<name<<endl;
	cout<<"您的用戶名爲\n"<<user_name<<endl;
	cout<<"您的密碼爲\n"<<password<<endl;
	cout<<"您的單位\n"<<workplace<<endl;
	cout<<"電話號碼\n"<<tel<<endl;
	cout<<"可借書數\n"<<ableb<<endl;
	cout<<"已借書數\n"<<hadb<<endl;
}

bool user::operator<(user a) //
{
    return strcmp(this->rname(),a.rname());
}

void user::sortshow() //
{
    ifstream inf("user.txt",ios::in|ios::binary);
	inf.seekg(0,ios::end);
	int ncnt=inf.tellg();
	ncnt/=sizeof(user);
	inf.close();
	ifstream in("user.txt",ios::in|ios::binary);
	list<user> lt;
	int cnt=ncnt;
	while(ncnt--)
	{
		user temp;
		in.read((char*)&temp,sizeof(user));
		lt.push_back(temp);
	}
	cout<<"所有的讀者信息如下\n";
	lt.sort();
	while(cnt--)
    {
        lt.front().show();
        lt.pop_front();
    }
}
char* user::getname()
{
    char *u=new char[strlen(user_name)];
    strcpy(u,user_name);
	return u;
}

char *user::getpw()
{
	char *u=new char[strlen(password)];
    strcpy(u,password);
	return u;
}

char* user::rname()
{
    char *u=new char[strlen(name)];
    strcpy(u,name);
	return u;
}

char* user::getwp()
{
    char *u=new char[strlen(workplace)];
    strcpy(u,workplace);
	return u;
}

long user::gettel()
{
    return this->tel;
}

int user::geta()
{
    return ableb;
}

int user::geth()
{
    return hadb;
}
void user::query()
{
    cout<<"請輸入你要查詢的讀者用戶名和密碼\n";
    int flag=0;
    char u[20],p[10];
    cin>>u>>p;
    ifstream inf("user.txt",ios::in|ios::binary);
	inf.seekg(0,ios::end);
	int ncnt=inf.tellg();
	ncnt/=sizeof(user);
	inf.close();
	ifstream in("user.txt",ios::in|ios::binary);
	list<user> lt;
	while(ncnt--)
	{
		user temp;
		in.read((char*)&temp,sizeof(user));
		if(scmp(u,temp.getname()) && scmp(p,temp.getpw()))
		{
		    flag=1;
            cout<<"請輸入你要對該讀者進行的操作1 刪除 2 修改\n";
            int tint;
            cin>>tint;
            if(tint==1)
            {
                cout<<"該讀者信息已被刪除\n";
                continue;
            }
            else if(tint==2)
            {
                char tu[20],tp[10],tn[10],tw[20];
                memset(tu,0,sizeof(tu));
                memset(tp,0,sizeof(tp));
                memset(tn,0,sizeof(tn));
                memset(tw,0,sizeof(tw));
                long tt;
                int ta,th;
                int anx=0;
                cout<<"是否修改用戶名 1 是 0 否\n";
                cin>>anx;
                if(anx==1)
                {
                    cout<<"請輸入\n";
                    cin>>tu;
                    memset(user_name,0,sizeof(user_name));
                    strcpy(user_name,tu);
                }
                anx=0;
                cout<<"是否修改密碼 1 是 0 否\n";
                cin>>anx;
                if(anx==1)
                {
                    cout<<"請輸入\n";
                    cin>>tp;
                    memset(password,0,sizeof(password));
                    strcpy(password,tp);
                }
                anx=0;
                cout<<"是否修改姓名 1 是 0 否\n";
                cin>>anx;
                if(anx==1)
                {
                    cout<<"請輸入\n";
                    cin>>tn;
                    memset(name,0,sizeof(name));
                    strcpy(name,tn);
                }
                anx=0;
                cout<<"是否修改單位 1 是 0 否\n";
                cin>>anx;
                if(anx==1)
                {
                    cout<<"請輸入\n";
                    cin>>tw;
                    memset(workplace,0,sizeof(workplace));
                    strcpy(workplace,tw);
                }
                anx=0;
                cout<<"是否修改電話號碼 1 是 0 否\n";
                cin>>anx;
                if(anx==1)
                {
                    cout<<"請輸入\n";
                    cin>>tt;
                    tel=tt;
                }
                anx=0;
                cout<<"是否修改可借書數 1 是 0 否\n";
                cin>>anx;
                if(anx==1)
                {
                    cout<<"請輸入\n";
                    cin>>ta;
                    ableb=ta;
                }
                anx=0;
                cout<<"是否修改已借書數 1 是 0 否\n";
                cin>>anx;
                if(anx==1)
                {
                    cout<<"請輸入\n";
                    cin>>th;
                    hadb=th;
                }
                temp.set(this->getname(),this->getpw(),this->rname(),this->getwp(),this->gettel(),this->geta(),this->geth());
                lt.push_back(temp);
            }
		}
		else lt.push_back(temp);
	}
	in.close();
	if(flag==0)
    {
        cout<<"該讀者信息不存在\n";
        return;
    }
    ofstream out("user.txt",ios::out|ios::binary);
	while(!lt.empty())
	{
	    user temp(lt.front().getname(),lt.front().getpw(),lt.front().rname(),lt.front().getwp(),lt.front().gettel(),lt.front().geta(),lt.front().geth());
		out.write((char*)&temp,sizeof(user));
		lt.pop_front();
	}
	out.close();
}

void user::mdf_s()
{
    char tu[20],tp[10],tn[10],tw[20];
    memset(tu,0,sizeof(tu));
    memset(tp,0,sizeof(tp));
    memset(tn,0,sizeof(tn));
    memset(tw,0,sizeof(tw));
    long tt;
    int ta,th;
    int anx=0;
    cout<<"是否修改用戶名 1 是 0 否\n";
    cin>>anx;
    if(anx==1)
    {
        cout<<"請輸入\n";
        cin>>tu;
    }
    else strcpy(tu,user_name);
    anx=0;
    cout<<"是否修改密碼 1 是 0 否\n";
    cin>>anx;
    if(anx==1)
    {
        cout<<"請輸入\n";
        cin>>tp;
    }
    else strcpy(tp,password);
    anx=0;
    cout<<"是否修改姓名 1 是 0 否\n";
    cin>>anx;
    if(anx==1)
    {
        cout<<"請輸入\n";
        cin>>tn;
    }
    else strcpy(tn,name);
    anx=0;
    cout<<"是否修改單位 1 是 0 否\n";
    cin>>anx;
    if(anx==1)
    {
        cout<<"請輸入\n";
        cin>>tw;
    }
    else strcpy(tw,workplace);
    anx=0;
    cout<<"是否修改電話號碼 1 是 0 否\n";
    cin>>anx;
    if(anx==1)
    {
        cout<<"請輸入\n";
        cin>>tt;
    }
    else tt=tel;
    anx=0;
    cout<<"是否修改可借書數 1 是 0 否\n";
    cin>>anx;
    if(anx==1)
    {
        cout<<"請輸入\n";
        cin>>ta;
    }
    else ta=ableb;
    anx=0;
    cout<<"是否修改已借書數 1 是 0 否\n";
    cin>>anx;
    if(anx==1)
    {
        cout<<"請輸入\n";
        cin>>th;
    }
    else th=hadb;
    setvalue(tu,tp,tn,tw,tt,ta,th);
}

user::~user()
{

}

book.h

#ifndef BOOK_H
#define BOOK_H


class book
{
    public:
        void cinbook();
        void mof_book();
        book();
        book(const book& other);
        void show();
    public:
        int rec;
        int book_num;
        char book_name[20];
        char aut[10];
        char ph[50];
        int sum;
        int bor;
        int p1,p2,p3;
};

#endif // BOOK_H

book.cpp

#include "book.h"
#include<iostream>
#include<fstream>
#include<vector>
#include<string.h>
bool scmp(char *a,char *b);
using namespace std;
struct bname
{
    char b_name[20];
    int len;
    int v[10];
    bname()
    {
        len=1;
        for(int i=0;i<10;i++)
        v[i]=0;
        memset(b_name,0,sizeof(b_name));
    }
};
struct baut
{
    char b_aut[10];
    int len;
    int v[10];
    baut()
    {
        len=1;
        for(int i=0;i<10;i++)
        v[i]=0;
        memset(b_aut,0,sizeof(b_aut));
    }
};
struct bph
{
    char b_ph[20];
    int len;
    int v[10];
    bph()
    {
        len=1;
        for(int i=0;i<10;i++)
        v[i]=0;
        memset(b_ph,0,sizeof(b_ph));
    }
};
book::book()
{
    memset(book_name,0,sizeof(book_name));
    memset(aut,0,sizeof(aut));
    memset(ph,0,sizeof(ph));
    book_num=0;
    rec=0;
    p1=0;
    p2=0;
    p3=0;
    bor=0;
    sum=0;
}

book::book(const book& other)
{
    memset(book_name,0,sizeof(book_name));
    memset(aut,0,sizeof(aut));
    memset(ph,0,sizeof(ph));
    strcpy(book_name,other.book_name);
    strcpy(aut,other.aut);
    strcpy(ph,other.ph);
    rec=other.rec;
    this->book_num=other.book_num;
    this->sum=other.sum;
    bor=other.bor;
    p1=other.p1;
    p2=other.p2;
    p3=other.p3;
}

void book::cinbook()
{
    memset(book_name,0,sizeof(book_name));
    memset(aut,0,sizeof(aut));
    memset(ph,0,sizeof(ph));
    cout<<"請輸入該書的記錄號\n";
    cin>>rec;
    cout<<"請輸入該書的書號\n";
    cin>>book_num;
    cout<<"請輸入該書的書名\n";
    cin>>book_name;
    cout<<"請輸入該書的作者\n";
    cin>>aut;
    cout<<"請輸入該書的出版社\n";
    cin>>ph;
    cout<<"請輸入該書的藏書量\n";
    cin>>sum;
    // bname
    {
        int flag=0;
        ifstream in("name.txt",ios::in|ios::binary);
        in.seekg(0,ios::end);
        int n=in.tellg();
        if(n<0) n=0;
        n/=sizeof(bname);
        bname btemp[n];
        in.close();
        ifstream inf("name.txt",ios::in|ios::binary);
        for(int i=0;i<n;i++)
        {
            inf.read((char*)&btemp[i],sizeof(bname));
            if(scmp(btemp[i].b_name,book_name))
            {
                flag=1;
                p1=btemp[i].v[btemp[i].len-1];
                btemp[i].len++;
                btemp[i].v[btemp[i].len-1]=rec;
            }
        }
        inf.close();
        ofstream out("name.txt",ios::out|ios::binary);
        for(int i=0;i<n;i++)
        {
            out.write((char*)&btemp[i],sizeof(bname));
        }
        if(flag==0)
        {
            bname btem;
            btem.v[0]=rec;
            strcpy(btem.b_name,book_name);
            out.write((char*)&btem,sizeof(bname));
        }
        out.close();
    }
    {
     // baut
        int flag=0;
        ifstream in("aut.txt",ios::in|ios::binary);
        in.seekg(0,ios::end);
        int n=in.tellg();
        if(n<0) n=0;
        n/=sizeof(baut);
        baut btemp[n];
        in.close();
        ifstream inf("aut.txt",ios::in|ios::binary);
        for(int i=0;i<n;i++)
        {
            inf.read((char*)&btemp[i],sizeof(baut));
            if(scmp(btemp[i].b_aut,aut))
            {
                flag=1;
                p2=btemp[i].v[btemp[i].len-1];
                btemp[i].len++;
                btemp[i].v[btemp[i].len-1]=rec;
            }
        }
        inf.close();
        ofstream out("aut.txt",ios::out|ios::binary);
        for(int i=0;i<n;i++)
        {
            out.write((char*)&btemp[i],sizeof(baut));
        }
        if(flag==0)
        {
            baut btem;
            btem.v[btem.len-1]=rec;
            strcpy(btem.b_aut,aut);
            out.write((char*)&btem,sizeof(baut));
        }
        out.close();
    }
    {
    // bph
        int flag=0;
        ifstream in("ph.txt",ios::in|ios::binary);
        in.seekg(0,ios::end);
        int n=in.tellg();
        if(n<0) n=0;
        n/=sizeof(bph);
        bph btemp[n];
        in.close();
        ifstream inf("ph.txt",ios::in|ios::binary);
        for(int i=0;i<n;i++)
        {
            inf.read((char*)&btemp[i],sizeof(bph));
            if(scmp(btemp[i].b_ph,ph))
            {
                flag=1;
                p3=btemp[i].v[btemp[i].len-1];
                btemp[i].len++;
                btemp[i].v[btemp[i].len-1]=rec;
            }
        }
        inf.close();
        ofstream out("ph.txt",ios::out|ios::binary);
        for(int i=0;i<n;i++)
        {
            out.write((char*)&btemp[i],sizeof(bph));
        }
        if(flag==0)
        {
            bph btem;
            btem.v[btem.len-1]=rec;
            strcpy(btem.b_ph,ph);
            out.write((char*)&btem,sizeof(bph));
        }
        out.close();
    }
    cout<<"正在將該書註冊到文件中\n";
    ofstream out("book.txt",ios::out|ios::binary|ios::app);
    book temp(*this);
    out.write((char*)&temp,sizeof(book));
    out.close();
    cout<<"註冊成功\n";
}

void book::mof_book()
{
    int r;
    cout<<"請輸入你想修改書的記錄號\n";
    cin>>r;
    ifstream inf("book.txt",ios::in|ios::binary);
	inf.seekg(0,ios::end);
	int ncnt=inf.tellg();
	ncnt/=sizeof(book);
	inf.close();
	ifstream in("book.txt",ios::in|ios::binary);
	vector<book>vt;
	while(ncnt--)
    {
        book temp;
        in.read((char*)&temp,sizeof(book));
        if(temp.rec==r)
        {
            cout<<"接下來請按照指示修改\n";
            int cnt=0;
            cout<<"是否修改該書的書號 0 否 1是\n";
            cin>>cnt;
            if(cnt==1)cin>>temp.book_num;
            cnt=0;
            cout<<"是否修改該書的藏書量 0 否 1是\n";
            cin>>cnt;
            if(cnt==1)cin>>temp.sum;
            vt.push_back(temp);
        }
        else vt.push_back(temp);
    }
    in.close();
    ofstream out("book.txt",ios::out|ios::binary);
    for(int i=0;i<vt.size();i++)
    {
        book temp(vt[i]);
        out.write((char*)&temp,sizeof(book));
    }
    vt.clear();
    out.close();
}

void book::show()
{
    cout<<"該書的信息如下\n";
    cout<<"記錄號  "<<rec;
    cout<<" 書號  "<<book_num;
    cout<<" 書名  "<<book_name;
    cout<<" 作者  "<<aut<<endl;
    cout<<"出版社  "<<ph;
    cout<<" 總書量  "<<sum;
    cout<<" 已借出量  "<<bor<<endl;
}

main.cpp

#include <iostream>
#include <fstream>
#include <cstring>
#include "user.h"
#include <termios.h>
#include <unistd.h>
#include "book.h"
#include <vector>
#include <time.h>
using namespace std;
void search_rec(int x);
void BC();  //圖書流通系統
struct BR
{
    int rthis;
    int byear,bmouth,bday,bhour,bmin,bsec;
    int ryear,rmouth,rday,rhour,rmin,rsec;
    BR()
    {
        rthis=0;
        byear=0,bmouth=0,bday=0,bhour=0,bmin=0,bsec=0;
        ryear=0,rmouth=0,rday=0,rhour=0,rmin=0,rsec=0;
    }
    BR(const BR&b)
    {
        rthis=b.rthis;
        byear=b.byear,bmouth=b.bmouth,bday=b.bday,bhour=b.bhour,bmin=b.bmin,bsec=b.bsec;
        ryear=b.ryear,rmouth=b.rmouth,rday=b.rday,rhour=b.rhour,rmin=b.rmin,rsec=b.rsec;
    }
    void set(BR b)
    {
        rthis=b.rthis;
        byear=b.byear,bmouth=b.bmouth,bday=b.bday,bhour=b.bhour,bmin=b.bmin,bsec=b.bsec;
        ryear=b.ryear,rmouth=b.rmouth,rday=b.rday,rhour=b.rhour,rmin=b.rmin,rsec=b.rsec;
    }
    int sum_BR()
    {
        ifstream inf("BR.txt",ios::in|ios::binary);
        inf.seekg(0,ios::end);
        int n=inf.tellg();
        n/=sizeof(BR);
        return n;
    }
    void show()
    {
        cout<<rthis;
        cout<<rday<<" \n";
    }
};
struct ubr
{
    char un[10];
    int len;
    BR v[10];
    ubr()
    {
        memset(un,0,sizeof(un));
        len=0;
    }
    int sum_ubr()
    {
        ifstream inf("UBR.txt",ios::in|ios::binary);
        inf.seekg(0,ios::end);
        int n=inf.tellg();
        n/=sizeof(ubr);
        return n;
    }
};
struct bname
{
    char b_name[20];
    int len;
    int v[10];
    bname()
    {
        len=1;
        for(int i=0;i<10;i++)
        v[i]=0;
        memset(b_name,0,sizeof(b_name));
    }
};
struct baut
{
    char b_aut[10];
    int len;
    int v[10];
    baut()
    {
        len=1;
        for(int i=0;i<10;i++)
        v[i]=0;
        memset(b_aut,0,sizeof(b_aut));
    }
};
struct bph
{
    char b_ph[20];
    int len;
    int v[10];
    bph()
    {
        len=1;
        for(int i=0;i<10;i++)
        v[i]=0;
        memset(b_ph,0,sizeof(b_ph));
    }
};
user now;
void B_a(); //圖書管理系統
int sum_book();
void search_book();
int getch()
{
    struct termios oldt,newt;
    int ch;
    tcgetattr( STDIN_FILENO, &oldt );//獲得標準輸入的終端參數,將獲得的信息保存在oldt變量中
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
    return ch;
}
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
bool pwcnt(char *u,char *p); // 判斷用戶名,密碼函數
void HZ(); //彙總
void N_r();  //讀者界面
void S_a(); // 系統管理員界面
void regs(); //註冊函數
bool scmp(char *a,char *b); // strcmp 函數
int main(int argc, char** argv)
{
    cout<<"按 1 表示登錄系統\n";
	cout<<"按 2 表示註冊用戶\n";
	int x;
	cin>>x;
	if(x==2)
	{
		regs();
		cout<<"你已經成功註冊了一個賬號,請登錄\n";
	}
	int t=3;
    if(t<=0)
    {
	    cout<<"您已輸錯3次用戶名密碼,該系統將自動退出\n";
	    return 0;
	}
	while(t)
    {
    	char u[20],p[10];
        cout<<"請輸入您的用戶名\n";
        memset(u,0,sizeof(u));
	    cin>>u;
	    getchar();
	    memset(p,0,sizeof(p));
	    cout<<"請輸入您的密碼\n";
	    {
            for(int i=0;i<6;i++)
            {
                p[i]=getch();
                cout<<'*';
            }
			cout<<endl;
	    }
		if(pwcnt(u,p))
	    {
		    cout<<"你以成功進入系統\n";
			cout<<"請選擇你的身份類型\n";
		    cout<<"1.普通讀者\n";
		    cout<<"2.圖書管理員\n";
		    cout<<"3.系統管理員\n";
		    cout<<"4.退出主菜單\n";
		    int n;
		    cin>>n;
		    if(n==1)
		    {
		        N_r();
		        t=3;
			}
		    if(n==2)
		    {
		        B_a();
		        t=3;
		    }
		    if(n==3)
		    {
		        S_a();
		        t=3;
		    }
		    if(n==4)
            {
                cout<<"您已退出主菜單\n";
                t=3;
                break;
            }
	    }
	    else
	    {
		    cout<<"您的用戶名密碼錯誤,請重新輸入\n";
		    t--;
		}
	}
	return 0;
}
bool scmp(char *a,char *b)
{
	for(unsigned int i=0;i<min(strlen(a),strlen(b));i++)
	if(a[i]!=b[i]) return false;
	return true;
}
bool pwcnt(char *u,char *p) //
{
	ifstream in("user.txt",ios::in|ios::binary);
	in.seekg(0,ios::end);
	int n=in.tellg();
	n/=sizeof(user);
	in.close();
	ifstream inf("user.txt",ios::in|ios::binary);
	while(n--)
	{
		user temp;
		inf.read((char*)&temp,sizeof(user));
	    if(scmp(u,temp.getname()) && scmp(p,temp.getpw()))
		{
		    now.set(temp.getname(),temp.getpw(),temp.rname(),temp.getwp(),temp.gettel(),temp.geta(),temp.geth());
			inf.close();
			return true;
		}
	}
	inf.close();
	return false;
}
void regs()  //
{
	char u[20],p[10],n[10],w[20];
	long t;
	memset(n,0,sizeof(n));
	memset(p,0,sizeof(p));
	memset(u,0,sizeof(u));
	memset(w,0,sizeof(w));
	cout<<"請輸入你想創建的用戶名\n";
	cin>>u;
	cout<<"請輸入你的密碼\n";
	cin>>p;
	cout<<"請輸入您的姓名\n";
	cin>>n;
	cout<<"請輸入您的單位\n";
	cin>>w;
	cout<<"請輸入您的電話號碼\n";
	cin>>t;
    user temp(u,p,n,w,t,10,0);
	ofstream out("user.txt",ios::out|ios::binary|ios::app);
	out.write((char*)&temp,sizeof(user));
	out.close();
	ofstream outb("UBR.txt",ios::out|ios::binary|ios::app);
	ubr ti;
	strcpy(ti.un,u);
	outb.write((char*)&ti,sizeof(ubr));
	outb.close();
}
void N_r()
{
    cout<<"請輸入你要執行的操作\n";
    int x;
    while(true)
    {
        cout<<"1.密碼修改\n";
        cout<<"2.圖書查詢\n";
        cout<<"3.借還書系統\n";
        cout<<"4.退出系統\n";
        cin>>x;
        if(x==1)
        {
            now.mdf_pw();
        }
        if(x==2)
        {
            search_book();
        }
        if(x==3)
        {
            BC();
        }
        if(x==4)
        {
            cout<<"您已成功退出系統\n";
            return;
        }
    }
}
void S_a()
{
    int x;
    while(true)
    {
        cout<<"1.用戶管理系統\n";
        cout<<"2.讀者管理系統\n";
        cout<<"3.返回主系統\n";
        cin>>x;
        if(x==1)
        {
            while(true)
            {
                int y;
                cout<<"1.用戶信息修改\n";
                cout<<"2.用戶信息刪除\n";
                cout<<"3.用戶信息顯示\n";
                cout<<"4.用戶密碼修改\n";
                cout<<"5.退出\n";
                cin>>y;
                if(y==1)
                {
                    now.mdf_s();
                }
                if(y==2)
                {
                    now.delete_();
                    return;
                }
                if(y==3)
                {
                    now.show();
                }
                if(y==4)
                {
                    now.mdf_pw();
                }
                if(y==5)
                {
                    cout<<"您已退出用戶管理系統\n";
                    break;
                }
            }
        }
        if(x==2)
        {
            while(true)
            {
                int y;
                cout<<"1.讀者信息修改\n";
                cout<<"2.讀者信息刪除\n";
                cout<<"3.讀者信息查詢\n";
                cout<<"4.讀者信息顯示\n";
                cout<<"5.退出\n";
                cin>>y;
                if(y==1)
                {
                    now.mdf_s();
                }
                if(y==2)
                {
                    now.delete_();
                    return;
                }
                if(y==3)
                {
                    now.query();
                }
                if(y==4)
                {
                    now.sortshow();
                }
                if(y==5)
                {
                    cout<<"您已退出讀者管理系統\n";
                    break;
                }
            }
        }
        if(x==3) break;
    }
}

void B_a()
{
    int bcnt;
    while(true)
    {
        book temp;
        cout<<"你已成功進入圖書管理員系統\n";
        cout<<"1. 圖書信息輸入\n";
        cout<<"2. 圖書信息修改\n";
        cout<<"3. 圖書信息查詢\n";
        cout<<"4. 彙總統計\n";
        cout<<"5. 退出\n";
        cin>>bcnt;
        if(bcnt==1)
        {
            temp.cinbook();
        }
        if(bcnt==2)
        {
            temp.mof_book();
        }
        if(bcnt==3)
        {
            search_book();
        }
        if(bcnt==4)
        {
            HZ();
        }
        if(bcnt==5) break;
    }
}
void search_book()
{
    int nt;
    while(true)
    {
        cout<<"請輸入你的查詢方式\n";
        cout<<"1,按書號查詢\n";
        cout<<"2,按書名查詢\n";
        cout<<"3,按作者查詢\n";
        cout<<"4,按出版社查詢\n";
        cout<<"5.退出\n";
        cin>>nt;
        if(nt==1)
        {
            int ncnt=sum_book();
            int num;
            cout<<"請輸入書號\n";
            cin>>num;
            ifstream in("book.txt",ios::binary|ios::in);
            while(ncnt--)
            {
                book temp;
                in.read((char*)&temp,sizeof(book));
                if(temp.book_num==num)
                {
                    temp.show();
                }
            }
            in.close();
        }
        if(nt==2)
        {
            ifstream inf("name.txt",ios::in|ios::binary);
            inf.seekg(0,ios::end);
            int ncnt=inf.tellg();
            if(ncnt<0) ncnt=0;
            ncnt/=sizeof(bname);
            inf.close();
            ifstream in("name.txt",ios::in|ios::binary);
            char Tname[20];
            memset(Tname,0,sizeof(Tname));
            cout<<"請輸入書名\n";
            cin>>Tname;
            int flag=0;
            while(ncnt--)
            {
                bname Ttemp;
                in.read((char*)&Ttemp,sizeof(bname));
                if(scmp(Tname,Ttemp.b_name))
                {
                    flag=1;
                    for(int i=0;i<10;i++)
                    if(Ttemp.v[i]!=0) search_rec(Ttemp.v[i]);
                    cout<<endl;
                }
            }
            if(flag==0) cout<<"無名爲"<<Tname<<"的書\n";
            in.close();
        }
        if(nt==3)
        {
            ifstream inf("aut.txt",ios::in|ios::binary);
            inf.seekg(0,ios::end);
            int ncnt=inf.tellg();
            if(ncnt<0) ncnt=0;
            ncnt/=sizeof(baut);
            inf.close();
            ifstream in("aut.txt",ios::in|ios::binary);
            char Tname[10];
            memset(Tname,0,sizeof(Tname));
            cout<<"請輸入作者\n";
            cin>>Tname;
            int flag=0;
            while(ncnt--)
            {
                baut Ttemp;
                in.read((char*)&Ttemp,sizeof(baut));
                if(scmp(Tname,Ttemp.b_aut))
                {
                    flag=1;
                    for(int i=0;i<10;i++)
                    if(Ttemp.v[i]!=0) search_rec(Ttemp.v[i]);
                    cout<<endl;
                }
            }
            if(flag==0) cout<<"無作者爲"<<Tname<<"的書\n";
            in.close();
        }
        if(nt==4)
        {
            ifstream inf("ph.txt",ios::in|ios::binary);
            inf.seekg(0,ios::end);
            int ncnt=inf.tellg();
            if(ncnt<0) ncnt=0;
            ncnt/=sizeof(bph);
            inf.close();
            ifstream in("ph.txt",ios::in|ios::binary);
            char Tname[20];
            memset(Tname,0,sizeof(Tname));
            cout<<"請輸入出版社名稱\n";
            cin>>Tname;
            int flag=0;
            while(ncnt--)
            {
                bph Ttemp;
                in.read((char*)&Ttemp,sizeof(bph));
                if(scmp(Tname,Ttemp.b_ph))
                {
                    flag=1;
                    for(int i=0;i<10;i++)
                    if(Ttemp.v[i]!=0) search_rec(Ttemp.v[i]);
                    cout<<endl;
                }
            }
            if(flag==0) cout<<"無出版社爲"<<Tname<<"的書\n";
            in.close();
        }
        if(nt==5) break;
    }
}

void BC()
{
    cout<<"您已進入圖書流通子系統\n";
    int cnt;
    while(true)
    {
        cout<<"1.借書處理\n";
        cout<<"2.還書處理\n";
        cout<<"3.逾期處理\n";
        cout<<"4.返回主菜單\n";
        cin>>cnt;
        if(cnt==1)
        {
            search_book();
            cout<<"請輸入您可借的書的記錄號(該書的已借出數小於總數)\n";
            int ans=0;
            cin>>ans;
            ifstream inf("book.txt",ios::in|ios::binary);
	        inf.seekg(0,ios::end);
	        int ncnt=inf.tellg();
	        ncnt/=sizeof(book);
	        inf.close();
	        if(ans<=0 || ans>ncnt) cout<<"該系統無該書\n";
	        vector<book>vt;
	        ifstream in("book.txt",ios::binary|ios::in);
            for(int i=1;i<=ncnt;i++)
            {
                book temp;
                in.read((char*)&temp,sizeof(book));
                if(i==ans)
                {
                    temp.bor++;
                }
                vt.push_back(temp);
            }
            in.close();
            ofstream out("book.txt",ios::out|ios::binary);
            for(int i=0;i<ncnt;i++)
            {
                book temp(vt[i]);
                out.write((char*)&temp,sizeof(book));
            }
            out.close();
            BR newbr;
            {
                newbr.rthis=ans;
                time_t tt;
                time(&tt);
                tt=tt+8*3600;  // transform the time zone
                tm* t= gmtime(&tt);
                newbr.byear=t->tm_year+1900,
                newbr.bmouth=t->tm_mon+1,
	            newbr.bday=t->tm_mday,
	            newbr.bhour=t->tm_hour,
	            newbr.bmin=t->tm_min,
	            newbr.bsec=t->tm_sec;
            }
            int ry,rm,rd;
            cout<<"請輸入您的還書日期 (年月日)\n";
            cin>>ry>>rm>>rd;
            ubr ti;
            int rcnt=ti.sum_ubr();
            vector<ubr>vbr;
            ifstream inb("UBR.txt",ios::in|ios::binary);
            for(int i=0;i<rcnt;i++)
            {
                ubr temp;
                inb.read((char*)&temp,sizeof(ubr));
                if(scmp(temp.un,now.getname()))
                {
                    newbr.ryear=ry;
                    newbr.rmouth=rm;
                    newbr.rday=rd;
                    temp.v[temp.len].set(newbr);
                    temp.len++;
                }
                vbr.push_back(temp);
            }
            inb.close();
            ofstream outb("UBR.txt",ios::out|ios::binary);
            for(int i=0;i<rcnt;i++)
            {
                ubr temp(vbr[i]);
                outb.write((char*)&temp,sizeof(ubr));
            }
            outb.close();
            cout<<"借書成功\n";
        }
        if(cnt==2)
        {
            cout<<"請輸入您還的書的記錄號\n";
            int ans=0;
            cin>>ans;
            ifstream inf("book.txt",ios::in|ios::binary);
	        inf.seekg(0,ios::end);
	        int ncnt=inf.tellg();
	        ncnt/=sizeof(book);
	        inf.close();
	        vector<book>vt;
	        ifstream in("book.txt",ios::binary|ios::in);
            for(int i=1;i<=ncnt;i++)
            {
                book temp;
                in.read((char*)&temp,sizeof(book));
                if(i==ans)
                {
                    temp.bor--;
                }
                vt.push_back(temp);
            }
            in.close();
            ofstream out("book.txt",ios::out|ios::binary);
            for(int i=0;i<ncnt;i++)
            {
                book temp(vt[i]);
                out.write((char*)&temp,sizeof(book));
            }
            out.close();
            BR newbr;
            {
                newbr.rthis=ans;
                time_t tt;
                time(&tt);
                tt=tt+8*3600;  // transform the time zone
                tm* t= gmtime(&tt);
                newbr.ryear=t->tm_year+1900,
                newbr.rmouth=t->tm_mon+1,
	            newbr.rday=t->tm_mday,
	            newbr.rhour=t->tm_hour,
	            newbr.rmin=t->tm_min,
	            newbr.rsec=t->tm_sec;
            }
            ubr ti;
            int rcnt=ti.sum_ubr();
            vector<ubr>vbr;
            ifstream inb("UBR.txt",ios::in|ios::binary);
            for(int i=0;i<rcnt;i++)
            {
                ubr temp;
                inb.read((char*)&temp,sizeof(ubr));
                if(scmp(temp.un,now.getname()))
                {
                    for(int i=0;i<temp.len;i++)
                    {
                        if(temp.v[i].rthis==newbr.rthis)
                        {
                            for(int j=i+1;j<temp.len;j++)
                            {
                                temp.v[j].set(temp.v[j+1]);
                            }
                            BR tj;
                            temp.len--;
                            temp.v[temp.len].set(tj);
                            break;
                        }
                    }
                }
                vbr.push_back(temp);
            }
            inb.close();
            ofstream outb("UBR.txt",ios::out|ios::binary);
            for(int i=0;i<rcnt;i++)
            {
                ubr temp(vbr[i]);
                outb.write((char*)&temp,sizeof(ubr));
            }
            outb.close();
            cout<<"還書成功\n";
        }
        if(cnt==3)
        {
            BR newbr;
            cout<<"正在查詢您的借書記錄\n";
            time_t tt;
            time(&tt);
            tt=tt+8*3600;  // transform the time zone
            tm* t= gmtime(&tt);
            newbr.ryear=t->tm_year+1900,
            newbr.rmouth=t->tm_mon+1,
            newbr.rday=t->tm_mday,
            newbr.rhour=t->tm_hour,
            newbr.rmin=t->tm_min,
            newbr.rsec=t->tm_sec;
            ubr ti;
            int rcnt=ti.sum_ubr();
            int flag=0;
            ifstream inb("UBR.txt",ios::in|ios::binary);
            for(int i=0;i<rcnt;i++)
            {
                ubr temp;
                inb.read((char*)&temp,sizeof(ubr));
                if(scmp(temp.un,now.getname()))
                {
                    for(int i=0;i<temp.len;i++)
                    {
                        if(temp.v[i].ryear<=newbr.ryear &&
                           temp.v[i].rmouth<=newbr.rmouth &&
                           temp.v[i].rday<=newbr.rday)
                        {
                            flag++;
                            cout<<"你的記錄號爲"<<temp.v[i].rthis<<"的書已逾期,請儘快歸還\n";
                        }
                    }
                }
            }
            if(flag==0) cout<<"你無書逾期!!\n";
            inb.close();
        }
        if(cnt==4)
        {
            break;
        }
    }
}
void search_rec(int x)
{
    ifstream in("book.txt",ios::binary|ios::in);
    for(int i=1;i<=x;i++)
    {
        book temp;
        in.read((char*)&temp,sizeof(book));
        if(i==x)temp.show();
    }
    in.close();
}
int sum_book()
{
    ifstream inf("book.txt",ios::in|ios::binary);
	inf.seekg(0,ios::end);
	int ncnt=inf.tellg();
	ncnt/=sizeof(book);
	inf.close();
	return ncnt;
}

void HZ()
{
    cout<<"圖書主文件\n";
    int n=sum_book();
    ifstream in("book.txt",ios::in|ios::binary);
    cout<<"記錄號  ";
    cout<<"書號  ";
    cout<<"書名  ";
    cout<<"作者  ";
    cout<<"出版社  ";
    cout<<"總書量  ";
    cout<<"已借出量  "<<endl;
    while(n--)
    {
        book temp;
        in.read((char*)&temp,sizeof(temp));
        cout<<"  "<<temp.rec;
        cout<<"     ";
        if(temp.book_num<1000) cout<<"0";
        cout<<temp.book_num;
        cout<<"  "<<temp.book_name;
        cout<<"  "<<temp.aut;
        cout<<"  "<<temp.ph;
        cout<<"  "<<temp.sum;
        cout<<"  "<<temp.bor<<endl;
    }
    in.close();
    cout<<"書名索引\n";
    {
        ifstream in("name.txt",ios::in|ios::binary);
        in.seekg(0,ios::end);
        int n=in.tellg();
        if(n<0) n=0;
        n/=sizeof(bname);
        in.close();
        ifstream inf("name.txt",ios::in|ios::binary);
        for(int i=0;i<n;i++)
        {
            bname btemp;
            inf.read((char*)&btemp,sizeof(bname));
            cout<<"書名"<<btemp.b_name<<"記錄號數量爲"<<btemp.len<<"如下\n";
            for(int i=0;i<btemp.len;i++)
            cout<<btemp.v[i]<<" ";
            cout<<endl;
        }
        inf.close();
    }
    cout<<"作者索引\n";
    {
     // baut
        ifstream in("aut.txt",ios::in|ios::binary);
        in.seekg(0,ios::end);
        int n=in.tellg();
        if(n<0) n=0;
        n/=sizeof(baut);
        in.close();
        ifstream inf("aut.txt",ios::in|ios::binary);
        for(int i=0;i<n;i++)
        {
            baut btemp;
            inf.read((char*)&btemp,sizeof(baut));
            cout<<"作者"<<btemp.b_aut<<"記錄號數量爲"<<btemp.len<<"如下\n";;
            for(int i=0;i<btemp.len;i++)
            cout<<btemp.v[i]<<" ";
            cout<<endl;
        }
        inf.close();
    }
    cout<<"出版社索引\n";
    {
    // bph
        ifstream in("ph.txt",ios::in|ios::binary);
        in.seekg(0,ios::end);
        int n=in.tellg();
        if(n<0) n=0;
        n/=sizeof(bph);
        in.close();
        ifstream inf("ph.txt",ios::in|ios::binary);
        for(int i=0;i<n;i++)
        {
            bph btemp;
            inf.read((char*)&btemp,sizeof(bph));
            cout<<"出版社"<<btemp.b_ph<<"記錄號數量爲"<<btemp.len<<"如下\n";;
            for(int i=0;i<btemp.len;i++)
            cout<<btemp.v[i]<<" ";
            cout<<endl;
        }
        inf.close();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章