C++項目開發(fā)實現(xiàn)圖書管理系統(tǒng)
本文實例為大家分享了C++實現(xiàn)圖書管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
一、需求分析
1.可以實現(xiàn)添加一條新的圖書信息(圖書名,圖書編號,圖書價格,圖書作者)
2.可以查看全部圖書條目
3.可以刪除指定的某條圖書記錄
二、系統(tǒng)設計
2.1系統(tǒng)功能介紹
1.添加新圖書模塊:該模塊可以實現(xiàn)將新圖書信息錄入到系統(tǒng)并將圖書信息保存到文件中。
2.瀏覽全部圖書模塊:可以通過該模塊獲取文件中全部圖書信息,確定圖書是否存在,及方便刪除。
3.刪除圖書模塊:可以根據(jù)圖書在文件中的記錄號刪除某條圖書記錄。
2.2系統(tǒng)預覽
主界面
添加新圖書界面
瀏覽全部圖書條目
三、代碼設計
3.1 圖書頭文件
#define NUM1 128 #define NUM2 50 class CBook{ ? public: ?? ?CBook(){} ?? ?CBook(char* cName,char*cIsbn,char* cPrice,char* cAuthor); ?? ?~CBook(){} public: ?? ?char* GetName();//獲取圖書名稱 ?? ?void SetName(char* cName);//設置圖書名稱 ?? ?char* GetIsbn();//獲取圖書ISBN編號 ?? ?void SetIsbn(char* clsbn);//設置圖書ISBN編號 ?? ?char* GetPrice();//獲得圖書價格 ?? ?void SetPrice(char* cPrice);//設置圖書價格 ?? ?char* GetAuthor();//獲得圖書作者信息 ?? ?void SetAuthor(char* cAuthor);//設置圖書作者信息 ?? ?void WriteData(); ?? ?void DeleteData(int iCount); ?? ?void GetBookFromFile(int iCount); protected: ?? ?char m_cName[NUM1]; ?? ?char m_cIsbn[NUM1]; ?? ?char m_cPrice[NUM2]; ?? ?char m_cAuthor[NUM2]; };
3.2 類中成員函數(shù)實現(xiàn)
#include "Book.h" #include <string> #include <fstream> #include <iostream> #include <iomanip> #include <stdio.h> using namespace std; CBook::CBook(char* cName, char*cIsbn, char* cPrice, char* cAuthor){ ?? ?strncpy_s(m_cName,cName,NUM1); ?? ?strncpy_s(m_cIsbn, cIsbn, NUM1); ?? ?strncpy_s(m_cPrice, cPrice, NUM2); ?? ?strncpy_s(m_cAuthor, cAuthor, NUM2); } ? char* CBook::GetName(){ ?? ?return m_cName; } ? void CBook::SetName(char* cName){ ?? ?strncpy_s(m_cName, cName, NUM1); } ? char* CBook::GetIsbn(){ ?? ?return m_cIsbn; } ? void CBook::SetIsbn(char* cIsbn){ ?? ?strncpy_s(m_cIsbn, cIsbn, NUM1); } ? char* CBook::GetPrice(){ ?? ?return m_cPrice; } ? void CBook::SetPrice(char*cPrice){ ?? ?strncpy_s(m_cPrice, cPrice, NUM2); } ? char* CBook::GetAuthor(){ ?? ?return m_cAuthor; } ? void CBook::SetAuthor(char* cAuthor){ ?? ?strncpy_s(m_cAuthor, cAuthor, NUM2); } ? ? void CBook::WriteData() { ?? ?ofstream ofile; ?? ?ofile.open("book.dat", ios::binary | ios::app); ?? ?try ?? ?{ ?? ??? ?ofile.write(m_cName, NUM1); ?? ??? ?ofile.write(m_cIsbn, NUM1); ?? ??? ?ofile.write(m_cPrice, NUM2); ?? ??? ?ofile.write(m_cAuthor, NUM2); ?? ?} ?? ?catch (...) ?? ?{ ?? ??? ?throw "file error occurred"; ?? ??? ?ofile.close(); ?? ?} ?? ?ofile.close(); } void CBook::GetBookFromFile(int iCount) { ?? ?char cName[NUM1]; ?? ?char cIsbn[NUM1]; ?? ?char cPrice[NUM2]; ?? ?char cAuthor[NUM2]; ?? ?ifstream ifile; ?? ?ifile.open("book.dat", ios::binary); ?? ?try ?? ?{ ?? ??? ?ifile.seekg(iCount*(NUM1 + NUM1 + NUM2 + NUM2), ios::beg); ?? ??? ?ifile.read(cName, NUM1); ?? ??? ?if (ifile.tellg()>0) ?? ??? ??? ?strncpy_s(m_cName, cName, NUM1); ?? ??? ?ifile.read(cIsbn, NUM1); ?? ??? ?if (ifile.tellg()>0) ?? ??? ??? ?strncpy_s(m_cIsbn, cIsbn, NUM1); ?? ??? ?ifile.read(cPrice, NUM2); ?? ??? ?if (ifile.tellg()>0) ?? ??? ??? ?strncpy_s(m_cIsbn, cIsbn, NUM2); ?? ??? ?ifile.read(cAuthor, NUM2); ?? ??? ?if (ifile.tellg()>0) ?? ??? ??? ?strncpy_s(m_cAuthor, cAuthor, NUM2); ?? ?} ?? ?catch (...) ?? ?{ ?? ??? ?throw "file error occurred"; ?? ??? ?ifile.close(); ?? ?} ?? ?ifile.close(); } void CBook::DeleteData(int iCount) { ?? ?long respos; ?? ?int iDataCount = 0; ?? ?fstream file; ?? ?fstream tmpfile; ?? ?ofstream ofile; ?? ?char cTempBuf[NUM1 + NUM1 + NUM2 + NUM2]; ?? ?file.open("book.dat", ios::binary | ios::in | ios::out); ?? ?tmpfile.open("temp.dat", ios::binary | ios::in | ios::out | ios::trunc); ?? ?file.seekg(0, ios::end); ?? ?respos = file.tellg(); ?? ?iDataCount = respos / (NUM1 + NUM1 + NUM2 + NUM2); ?? ?if (iCount < 0 && iCount > iDataCount) ?? ?{ ?? ??? ?throw "Input number error"; ?? ?} ?? ?else ?? ?{ ?? ??? ?file.seekg((iCount)*(NUM1 + NUM1 + NUM2 + NUM2), ios::beg); ?? ??? ?for (int j = 0; j<(iDataCount - iCount); j++) ?? ??? ?{ ?? ??? ??? ?memset(cTempBuf, 0, NUM1 + NUM1 + NUM2 + NUM2); ?? ??? ??? ?file.read(cTempBuf, NUM1 + NUM1 + NUM2 + NUM2); ?? ??? ??? ?tmpfile.write(cTempBuf, NUM1 + NUM1 + NUM2 + NUM2); ?? ??? ?} ?? ??? ?file.close(); ?? ??? ?tmpfile.seekg(0, ios::beg); ?? ??? ?ofile.open("book.dat"); ?? ??? ?ofile.seekp((iCount - 1)*(NUM1 + NUM1 + NUM2 + NUM2), ios::beg); ?? ??? ?for (int i = 0; i<(iDataCount - iCount); i++) ?? ??? ?{ ?? ??? ??? ?memset(cTempBuf, 0, NUM1 + NUM1 + NUM2 + NUM2); ?? ??? ??? ?tmpfile.read(cTempBuf, NUM1 + NUM1 + NUM2 + NUM2); ?? ??? ??? ?ofile.write(cTempBuf, NUM1 + NUM1 + NUM2 + NUM2); ?? ??? ?} ?? ?} ?? ?tmpfile.close(); ?? ?ofile.close(); ?? ?remove("temp.dat"); }
3.3主函數(shù)代碼
#include <iostream> #include <iomanip> #include <stdlib.h> #include <conio.h> #include <string.h> #include <fstream> #include "Book.h" ? #define CMD_COLS 80 #define CMD_LINES 25 using namespace std; ? void SetScreenGrid(); void ClearScreen(); void SetSysCaption(); void SetSysCaption(const char *pText); void ShowWelcome(); void ShowRootMenu(); void WaitView(int ?iCurPage); void WaitUser(); void GuideInput(); int GetSelect(); long GetFileLength(ifstream & ifs); void ViewData(int iSelPage); void DeleteBookFromFile(); void mainloop(); ? void SetScreenGrid() { ?? ?char sysSetBuf[80]; ?? ?sprintf_s(sysSetBuf, "mode con cols=%d lines=%d", CMD_COLS, CMD_LINES); ?? ?system(sysSetBuf); } void ClearScreen() { ?? ?system("cls"); } void SetSysCaption() { ?? ?system("title Sample"); } void SetSysCaption(const char *pText) { ?? ?char sysSetBuf[80]; ?? ?sprintf_s(sysSetBuf, "title %s", pText); ?? ?system(sysSetBuf); } void ShowWelcome() { ?? ?for (int i = 0; i<7; i++) ?? ?{ ?? ??? ?cout << endl; ?? ?} ?? ?cout << setw(40); ?? ?cout << "**************" << endl; ?? ?cout << setw(40); ?? ?cout << "*圖書管理系統(tǒng)*" << endl; ?? ?cout << setw(40); ?? ?cout << "**************" << endl; } void ShowRootMenu() { ?? ?cout << setw(40); ?? ?cout << "請選擇功能:" << endl; ?? ?cout << endl; ?? ?cout << setw(38); ?? ?cout << "1 添加新書" << endl; ?? ?cout << endl; ?? ?cout << setw(38); ?? ?cout << "2 瀏覽全部" << endl; ?? ?cout << endl; ?? ?cout << setw(38); ?? ?cout << "3 刪除圖書" << endl; } ? ? void WaitView(int ?iCurPage) { ?? ?char buf[256]; ?? ?gets_s(buf); ?? ?if (buf[0] == 'q') ?? ??? ?system("exit"); ?? ?if (buf[0] == 'm') ?? ??? ?mainloop(); ?? ?if (buf[0] == 'n') ?? ??? ?ViewData(iCurPage); } void WaitUser() { ?? ?int iInputPage = 0; ?? ?cout << "enter返回主菜單,q退出" << endl; ?? ?char buf[256]; ?? ?gets_s(buf); ?? ?if (buf[0] == 'q') ?? ??? ?system("exit"); } void GuideInput() { ?? ?char inName[NUM1]; ?? ?char inIsdn[NUM1]; ?? ?char inPrice[NUM2]; ?? ?char inAuthor[NUM2]; ? ?? ?cout << "輸入書名" << endl; ?? ?cin >> inName; ?? ?cout << "輸入ISDN" << endl; ?? ?cin >> inIsdn; ?? ?cout << "輸入價格" << endl; ?? ?cin >> inPrice; ?? ?cout << "輸入作者" << endl; ?? ?cin >> inAuthor; ?? ?CBook book(inName, inIsdn, inPrice, inAuthor); ?? ?book.WriteData(); ?? ?cout << "Write Finish" << endl; ?? ?WaitUser(); } ? int GetSelect() { ?? ?char buf[256]; ?? ?gets_s(buf); ?? ?return atoi(buf); } long GetFileLength(ifstream & ifs) { ?? ?long tmppos; ?? ?long respos; ?? ?tmppos = ifs.tellg();//獲得當前位置 ?? ?ifs.seekg(0, ios::end); ?? ?respos = ifs.tellg(); ?? ?ifs.seekg(tmppos, ios::beg);//恢復當前位置 ?? ?return respos; } ? ? void ViewData(int iSelPage = 1) { ?? ?int iPage = 0; ?? ?int iCurPage = 0; ?? ?int iDataCount = 0; ?? ?char inName[NUM1]; ?? ?char inIsbn[NUM1]; ?? ?char price[NUM2]; ?? ?char inAuthor[NUM2]; ?? ?bool bIndex = false; ?? ?int iFileLength; ?? ?iCurPage = iSelPage; ?? ?ifstream ifile; ?? ?ifile.open("book.dat", ios::binary);//|ios::nocreate ?? ?iFileLength = GetFileLength(ifile); ?? ?iDataCount = iFileLength / (NUM1 + NUM1 + NUM2 + NUM2); ?? ?if (iDataCount >= 1) ?? ??? ?bIndex = true; ?? ?iPage = iDataCount / 20 + 1; //每頁20條記錄 ? ? ?? ?ClearScreen(); ? ?? ?cout << " 共有記錄" << iDataCount << " "; ?? ?cout << " 共有頁數(shù)" << iPage << " "; ?? ?cout << " 當前頁數(shù)" << iCurPage << " "; ?? ?cout << " n顯示下一頁 m返回" << endl; ?? ?cout << setw(5) << "Index"; ?? ?cout << setw(22) << "Name" << setw(22) << "Isbn"; ?? ?cout << setw(15) << "Price" << setw(15) << "Author"; ?? ?cout << endl; ?? ?try ?? ?{ ?? ??? ?ifile.seekg((iCurPage - 1) * 20 * (NUM1 + NUM1 + NUM2 + NUM2), ios::beg); ?? ??? ?if (!ifile.fail()) ?? ??? ?{ ?? ??? ??? ?for (int i = 1; i<21; i++) ?? ??? ??? ?{ ?? ??? ??? ??? ?memset(inName, 0, 128); ?? ??? ??? ??? ?memset(inIsbn, 0, 128); ?? ??? ??? ??? ?memset(price, 0, 50); ?? ??? ??? ??? ?memset(inAuthor, 0, 50); ?? ??? ??? ??? ?if (bIndex) ?? ??? ??? ??? ??? ?cout << setw(3) << ((iCurPage - 1) * 20 + i); ?? ??? ??? ??? ?ifile.read(inName, NUM1); ?? ??? ??? ??? ?cout << setw(24) << inName; ?? ??? ??? ??? ?ifile.read(inIsbn, NUM1); ?? ??? ??? ??? ?cout << setw(24) << inIsbn; ?? ??? ??? ??? ?ifile.read(price, NUM2); ?? ??? ??? ??? ?cout << setw(12) << price; ?? ??? ??? ??? ?ifile.read(inAuthor, NUM2); ?? ??? ??? ??? ?cout << setw(12) << inAuthor; ?? ??? ??? ??? ?cout << endl;//一條紀錄 ?? ??? ??? ??? ?if (ifile.tellg()<0) ?? ??? ??? ??? ??? ?bIndex = false; ?? ??? ??? ??? ?else ?? ??? ??? ??? ??? ?bIndex = true; ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?catch (...) ?? ?{ ?? ??? ?cout << "throw file exception" << endl; ?? ??? ?throw "file error occurred"; ?? ??? ?ifile.close(); ?? ?} ?? ?if (iCurPage<iPage) ?? ?{ ?? ??? ?iCurPage = iCurPage + 1; ?? ??? ?WaitView(iCurPage); ?? ?} ?? ?else ?? ?{ ?? ??? ?WaitView(iCurPage); ?? ?} ?? ?ifile.close(); } ? ? void DeleteBookFromFile() { ?? ?int iDelCount; ?? ?cout << "Input delete index" << endl; ?? ?cin >> iDelCount; ?? ?CBook tmpbook; ?? ?tmpbook.DeleteData(iDelCount); ?? ?cout << "Delete Finish" << endl; ?? ?WaitUser(); } void mainloop() { ?? ?ShowWelcome(); ?? ?while (1) ?? ?{ ?? ??? ?ClearScreen(); ?? ??? ?ShowWelcome(); ?? ??? ?ShowRootMenu(); ?? ??? ?switch (GetSelect()) ?? ??? ?{ ?? ??? ?case 1: ?? ??? ??? ?ClearScreen(); ?? ??? ??? ?GuideInput(); ?? ??? ??? ?break; ?? ??? ?case 2: ?? ??? ??? ?ClearScreen(); ?? ??? ??? ?ViewData(); ?? ??? ??? ?break; ?? ??? ?case 3: ?? ??? ??? ?ClearScreen(); ?? ??? ??? ?DeleteBookFromFile(); ?? ??? ??? ?break; ?? ??? ?} ?? ?} } void main() { ? ?? ?SetScreenGrid(); ?? ?SetSysCaption("圖書管理系統(tǒng)"); ?? ?mainloop(); }
【注】開發(fā)環(huán)境為VS2013控制臺程序
根據(jù)《C++項目開發(fā)全程實錄》修改
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C++中Overload,Override,Hide之間的區(qū)別
重載overload,這個概念是大家熟知的。在同一可訪問區(qū)內(nèi)被聲名的幾個具有不同參數(shù)列的(參數(shù)的類型、個數(shù)、順序不同)同名函數(shù),程序會根據(jù)不同的參數(shù)列來確定具體調(diào)用哪個函數(shù),這種機制就是重載2013-09-09C語言詳細分析不同類型數(shù)據(jù)在內(nèi)存中的存儲
使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么2022-08-08C++的靜態(tài)成員變量和靜態(tài)成員函數(shù)詳解
這篇文章主要為大家介紹了C++的靜態(tài)成員變量和靜態(tài)成員函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-12-12