C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之圖書借閱系統(tǒng)
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)圖書借閱系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
/***************************** ? @title: 數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn) ? @name: <實(shí)驗(yàn)2-1> 線性表(順序表)的應(yīng)用--我的圖書館 ? @object: ? ? ? [實(shí)驗(yàn)?zāi)康腯 ? ? ? ? ? 應(yīng)用線性表解決問題. ? ? ? ? ? 有若干圖書,借出的書需要登記下來(lái).? ? ? ? ? ? 用兩個(gè)線性表分別保存現(xiàn)有圖書和借書信息, ? ? ? ? ? 并實(shí)現(xiàn)增加新書,借書,還書,打印等功能. ? ? ? ? ? 學(xué)習(xí)命令式程序界面的編寫方法. ? ? ? [實(shí)驗(yàn)提示] ? ? ? ? ? 1. 在book.h中描述了描述書的Book類型,還有 ? ? ? ? ? 幾個(gè)有關(guān)函數(shù)函數(shù)可以調(diào)用.? ? ? ? ? ? 2. 在sqlist.h中完成順序表的各種操作.? ? ? ? ? ? 3. 借書時(shí),輸入書名,若有存書,則從存書表中 ? ? ? ? ? 刪除,插入借書表. ? ? ? ? ? 4. 還書時(shí),輸入書名,若借過(guò)此書,則從借書表 ? ? ? ? ? 中刪除,插入存書表.? ? @include: ? ? ? 用到的頭文件 ? @usage: ? ? ? 請(qǐng)查看"TO-DO列表",根據(jù)要求完成代碼 ? @copyright: BTC 2005, Zhuang Bo ? @author: Zhuang Bo ? @date: 2005 ? @description: *****************************************************/ ? #include <cstdlib> #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; ? #include "book.h" #define ElemType Book ? ?//使用Book作為線性表元素的類型? #include "sqlist.h" ? SqList s; ? ? ? ?//存書表? SqList b; ? ? ? ?//借書表? ? void SystemInitialize(); void SystemTerminate(); void SystemRun(); ? int main(int argc, char *argv[]) { ? ?? ? ? SystemInitialize(); ? ? ? ? SystemRun(); ? ? ? ? SystemTerminate(); ? ? ? ?? ? ? system("PAUSE"); ? ? return 0; } ? void SystemInitialize () { ? ? InitList ( s ); ? ? InitList ( b ); ? ?? ? ? Book mybooks[] = { ? ? ? ? {"C Programming Language"}, ? ? ? ? {"Data Structures"}, ? ? ? ? {"C++ Programming Language"}, ? ? ? ? {"Effactive C++"}, ? ? ? ? {"More Effactive C++"}, ? ? ? ? {"Design Patterns"} ? ? }; ? ? ? ? for ( int i=0; i<6; i++ ) ? ? ? ? ListInsert( s, i, mybooks[i]);? } ? void SystemRun() { ? ? char GetCommand(); ? ? void DoCommand (char cmd); ? ? char cmd; ? ?? ? ? do { ? ? ? ? cmd = GetCommand(); ? ? ? ? DoCommand(cmd); ? ? } while ( cmd!='q' ); } ? char GetCommand () { ? ? char str[64]; ? ?printf("\na:新書 b:借書 r:還書 p:打印 q:退出\n" ); ? ? printf("."); ? ? //cin.getline(str,64); ? ? read(str); ?? ?return str[0]; } ? void DoCommand ( char cmd ) { ? ? void AddNewBook(); ? ? void BorrowBook(); ? ? void ReturnBook(); ? ? void PrintBookLists(); ? ?? ? ? switch ( cmd ) { ? ? case 'a': ? ? ? ? AddNewBook(); ? ? ? ? break; ? ? case 'b': ? ? ? ? BorrowBook(); ? ? ? ? break; ? ? case 'r': ? ? ? ? ReturnBook(); ? ? ? ? break; ? ? case 'p': ? ? ? ? PrintBookLists(); ? ? ? ? break; ? ? case 'q': ? ? ? ? break; ? ? default: ? ? ? ? printf("命令錯(cuò)誤");? ? ? } } ? void AddNewBook() { ? ? Book abook; ? ?? ? ? printf( "\n輸入新書名:"); ? ? ReadBook(abook); ? ? if ( ListInsert(s,1,abook) ) ? ? ? ? printf( "入庫(kù)成功" ); ? ? else ? ? ? ? printf( "入庫(kù)失敗" ); } ? void BorrowBook() { ? ? Book abook; ? ? int k; ? ?? ? ? printf("\n借書書名:"); ? ? ReadBook(abook); ? ? k = LocateElem(s,abook,BookEqual); ? ? if ( k!=0 ) { ? ? ? ? // TODO (#1#): 借書? ? ? ? ? ?ListDelete(s,k,abook); ?? ??? ? ListInsert(b,k,abook); ? ? ? ? //------------------------------------- ? ? ? ? ?printf("\n借書成功" ); ? ? } else ? ? ? printf( "\n查無(wú)此書" ); } ? void ReturnBook() { ? ? Book abook; ? ? int k; ? ?? ? ?printf( "\n還書書名:"); ? ? ReadBook(abook); ? ? k = LocateElem(b,abook,BookEqual); ? ? if ( k!=0 ) { ? ? ? ? // TODO (#1#): 還書? ? ? ? ? ListInsert(s,k,abook); ?? ??? ? ListDelete(b,k,abook); ? ? ? ? //------------------------------------- ? ? ? ? printf("\n還書成功" ); ? ? } else ? ? ? ? printf( "\n查無(wú)此書" ); } ? void PrintBookLists() { ? ?printf( "庫(kù)存 %d本書\n" , ListLength(s) ); ? ? ListTraverse ( s, PrintBook ); ? ? printf( "\n借出%d本書 " , ListLength(b) ?); ? ? ListTraverse ( b, PrintBook ); } ? void SystemTerminate ()? { ? ? DestroyList ( s ); ? ? DestroyList ( b ); }
/* ? Name: sqlist.h ? Copyright:? ? Author:? ? Date: 21-03-05 20:21 ? Description:? */ ? #ifndef SQLIST_H_INCLUDED #define SQLIST_H_INCLUDED ? #include "ds.h" //for Status,OK ... ? #ifndef ElemType #define ElemType int /* 數(shù)據(jù)元素類型默認(rèn)為 int */ #define ELEMTYPE_TAG #endif ? /********************************************************** * ?順序表的存儲(chǔ)結(jié)構(gòu)定義? ***********************************************************/ #define LIST_INIT_SIZE 100 /* 存儲(chǔ)空間初始分配容量 */ #define LISTINCREMENT 10 /* 存儲(chǔ)空間分配的增量 */ typedef struct { ? ? ElemType *elem; ? ?//存儲(chǔ)空間基址 ? ? int length; ? ? ? ?//當(dāng)前長(zhǎng)度? ? ? int listsize; ? ? ?//當(dāng)前已分配的存儲(chǔ)空間(元素個(gè)數(shù))? } SqList; ? /********************************************************** * ?順序表的基本操作聲明 ***********************************************************/ ? //創(chuàng)建并初始化為空表? Status InitList(SqList &L); ? //銷毀整個(gè)表(從此之后不再可用)? Status DestroyList(SqList &L); ? //將表L置空? Status ClearList(SqList &L); ? //判斷表L是否為空表? bool ListEmpty(SqList L); ? //求表L的長(zhǎng)度? int ListLength(SqList L); ? //取表L中的第i個(gè)元素,并用e返回. 操作成功返回OK,失敗時(shí)返回ERROR? Status GetElem(SqList L, int i, ElemType &e); ? template <typename T> bool equal(T a, T b) { ? ? return a==b; } //在表L中定位元素e首次出現(xiàn)的位置. 操作成功返回位序,失敗時(shí)返回0? // ? ?compare(a,b) 為比較函數(shù),匹配時(shí)返回true,否則返回false? // ? ? ? ? ? ? ? ? 這里默認(rèn)使用equal進(jìn)行比較? ? int LocateElem(SqList L, ElemType e,? ? ? ? bool (*compare)(ElemType,ElemType)); ? //在表L中插入第i個(gè)元素e. 操作成功返回OK,失敗時(shí)返回ERROR Status ListInsert(SqList &L, int i, ElemType e); ? //刪除表L中第i個(gè)元素,結(jié)果用e返回. 操作成功返回OK,失敗時(shí)返回ERROR? Status ListDelete(SqList &L, int i, ElemType &e); ? //遍歷表L,對(duì)每個(gè)元素調(diào)用visit(x).? Status ListTraverse(SqList L, Status (*visit)(ElemType)); ? ? /********************************************************** * ?順序表的基本操作的實(shí)現(xiàn) ***********************************************************/ ? //創(chuàng)建并初始化為空表? Status InitList(SqList &L) { ? ? // TODO (#1#): 創(chuàng)建空表? ?? ?L.elem=(ElemType *)malloc(LIST_INIT_SIZE *sizeof(ElemType)); ?? ?L.length=L.listsize=0; ? ? L.listsize=LIST_INIT_SIZE; ? ? return OK; ? ? //------------------------------------- } ? //銷毀整個(gè)表(從此之后不再可用)? Status DestroyList(SqList &L) { ? ? // TODO (#1#): 銷毀表? ?? ?if(L.elem){ ?? ??? ?free(L.elem); ?? ??? ?return OK; ?? ?} ?? ?else? ? ? return ERROR; ? ? //------------------------------------- } ? //將表L置空? Status ClearList(SqList &L) { ? ? // TODO (#1#): 清空表 ?? ?if(L.elem==NULL){ ?? ? ? L.length=0; ?? ? ? return OK; ?? ?}else ? ? return ERROR; ? ? //------------------------------------- } ? //判斷表L是否為空表? bool ListEmpty(SqList L) { ? ? // TODO (#1#): 順序表判空? ?? ?if (L.length==0) ? ?return false; ?? ?else return OK; ? ? //------------------------------------- } ? //求表L的長(zhǎng)度? int ListLength(SqList L) { ? ? // TODO (#1#): 求順序表長(zhǎng)度 ?? ?return L.length; ? ? ? ? //------------------------------------- } ? //取表L中的第i個(gè)元素,并用e返回. 操作成功返回OK,失敗時(shí)返回ERROR? Status GetElem(SqList L, int i, ElemType &e) { ? ? // TODO (#1#): 取元素 ?? ?if(i<1||i>L.length) ? ? return ERROR;? ?? ?e=L.elem[i-1]; ?? ?return OK; ? ? //------------------------------------- } ? //在表L中定位元素e首次出現(xiàn)的位置. 操作成功返回位序,失敗時(shí)返回0? // ? ?compare(a,b) 為比較函數(shù),匹配時(shí)返回true,否則返回false? int LocateElem(SqList L, ElemType e, bool (*compare)(ElemType,ElemType)) { ? ? // TODO (#1#): 在表中定位元素e,用compare(a,b)匹配元素 ? ? for (int j=0; j<L.length; j++) ? ? ? ? if ( compare(L.elem[j],e) ) ?return j+1; ? ? return 0; ? ? //------------------------------------- } ? ? //在表L中插入第i個(gè)元素e. 操作成功返回OK,失敗時(shí)返回ERROR Status ListInsert(SqList &L, int i, ElemType e) { ? ? // TODO (#1#): 在鏈表中插入元素 ?? ?if (i<1||i>L.length+1) ? ?return ERROR; ?? ?for(int j=L.length;j>=i;j--) ? ? ?? ?L.elem[j]=L.elem[j-1]; ? ? ? ? ? ? ? ? ? L.elem[i-1]=e; ? ??? ?L.length++; ?? ?return OK; ?? ?//------------------------------------- } ? //刪除表L中第i個(gè)元素,結(jié)果用e返回. 操作成功返回OK,失敗時(shí)返回ERROR? Status ListDelete(SqList &L, int i, ElemType &e) { ? ? // TODO (#1#): 在順序表中刪除元素 ?? ?if(i<1||i>L.length) ? ? return ERROR; ?? ?for(int j=i;j<=L.length;j++) ?? ??? ?L.elem[j-1]=L.elem[j]; ?? ?--L.length; ?? ?return OK; ? ? //------------------------------------- } ? //遍歷表L,對(duì)每個(gè)元素調(diào)用visit(x).? Status ListTraverse(SqList L, Status (*visit)(ElemType)) { ? ? // TODO (#1#): 遍歷順序表? ? ? for (int j=0; j<L.length; j++) ? ? ? ? if ( ! visit(L.elem[j]) ) ?return ERROR; ? ? return OK; ? ? //------------------------------------- } ? ? #ifdef ELEMTYPE_TAG #undef ElemType #undef ELEMTYPE_TAG #endif ? #endif ?// SQLIST_H_INCLUDED
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C語(yǔ)言實(shí)現(xiàn)圖書管理系統(tǒng)
- C語(yǔ)言圖書管理系統(tǒng)簡(jiǎn)潔版
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單圖書管理系統(tǒng)
- C語(yǔ)言圖書管理系統(tǒng)課程設(shè)計(jì)
- C語(yǔ)言鏈表實(shí)現(xiàn)圖書管理系統(tǒng)
- C語(yǔ)言圖書借閱系統(tǒng)源碼
- C語(yǔ)言設(shè)計(jì)圖書登記系統(tǒng)與停車場(chǎng)管理系統(tǒng)的實(shí)例分享
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的圖書管理系統(tǒng)
- 基于C語(yǔ)言實(shí)現(xiàn)圖書管理信息系統(tǒng)設(shè)計(jì)
- C語(yǔ)言實(shí)現(xiàn)圖書館管理系統(tǒng)
相關(guān)文章
C語(yǔ)言 深入探究動(dòng)態(tài)規(guī)劃之區(qū)間DP
這幾天在做有關(guān)dp的題,看到一個(gè)石子合并的問題,本來(lái)以為是個(gè)貪心,后來(lái)仔細(xì)一想壓根不是貪心。貪心算法的思路是每次都取最大的,然而石子合并問題有個(gè)限制條件就是每次只能取相鄰的,這就決定了它不是個(gè)貪心2022-04-04C++中可正確獲取UTF-8字符長(zhǎng)度的函數(shù)分享
這篇文章主要介紹了C++中可正確獲取UTF-8字符長(zhǎng)度的函數(shù)分享,需要的朋友可以參考下2014-08-08C++中高性能內(nèi)存池的實(shí)現(xiàn)詳解
在 C/C++ 中,內(nèi)存管理是一個(gè)非常棘手的問題,我們?cè)诰帉懸粋€(gè)程序的時(shí)候幾乎不可避免的要遇到內(nèi)存的分配邏輯。本文將通過(guò)C++實(shí)現(xiàn)高性能內(nèi)存池,感興趣的可以了解一下2022-10-10C++實(shí)踐數(shù)組類運(yùn)算的實(shí)現(xiàn)參考
今天小編就為大家分享一篇關(guān)于C++實(shí)踐數(shù)組類運(yùn)算的實(shí)現(xiàn)參考,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02詳解C++中構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)和賦值函數(shù)的區(qū)別和實(shí)現(xiàn)
這篇文章主要介紹了C++中構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)和賦值函數(shù)的區(qū)別和實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03