亲宝软件园·资讯

展开

C++图书管理系统

小凡大帝 人气:0

一、需求分析

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++项目开发全程实录》修改

加载全部内容

相关教程
猜你喜欢
用户评论