首頁 > 軟體

C++專案開發實現圖書管理系統

2022-03-12 13:00:07

本文範例為大家分享了C++實現圖書管理系統的具體程式碼,供大家參考,具體內容如下

一、需求分析

1.可以實現新增一條新的圖書資訊(圖書名,圖書編號,圖書價格,圖書作者)
2.可以檢視全部圖書條目
3.可以刪除指定的某條圖書記錄

二、系統設計

2.1系統功能介紹

1.新增新圖書模組:該模組可以實現將新圖書資訊錄入到系統並將圖書資訊儲存到檔案中。
2.瀏覽全部圖書模組:可以通過該模組獲取檔案中全部圖書資訊,確定圖書是否存在,及方便刪除。
3.刪除圖書模組:可以根據圖書在檔案中的記錄號刪除某條圖書記錄。

2.2系統預覽

主介面

新增新圖書介面

瀏覽全部圖書條目

三、程式碼設計

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 類中成員函數實現

#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主函數程式碼

#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 << "*圖書管理系統*" << 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 << " 共有頁數" << iPage << " ";
    cout << " 當前頁數" << 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("圖書管理系統");
    mainloop();
}

【注】開發環境為VS2013控制檯程式
根據《C++專案開發全程實錄》修改

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com