C++项目开发实现图书管理系统

 更新时间:2022年03月12日 10:36:03   作者:小凡大帝  
这篇文章主要为大家详细介绍了C++项目开发实现图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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++项目开发全程实录》修改

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++中Overload,Override,Hide之间的区别

    C++中Overload,Override,Hide之间的区别

    重载overload,这个概念是大家熟知的。在同一可访问区内被声名的几个具有不同参数列的(参数的类型、个数、顺序不同)同名函数,程序会根据不同的参数列来确定具体调用哪个函数,这种机制就是重载
    2013-09-09
  • Matlab绘制雨云图的方法详解

    Matlab绘制雨云图的方法详解

    这篇文章主要介绍了如何利用Matlab实现雨云图的绘制,文中的示例代码讲解详细,对我们学习Matlab有一定的帮助,需要的可以参考一下
    2022-05-05
  • c++ 动态内存分配相关总结

    c++ 动态内存分配相关总结

    这篇文章主要介绍了c++ 动态内存分配相关的相关资料,帮助大家更好的理解和学习和使用c++,感兴趣的朋友可以了解下
    2021-02-02
  • VC++实现模拟汉诺塔效果

    VC++实现模拟汉诺塔效果

    本文给大家分享的是一则使用vc++实现模拟汉诺塔效果的代码,代码实现起来很简单,主要是汉诺塔算法的思路要正确,正在练习汉诺塔的小伙伴也可以来看看,希望大家能够喜欢。
    2015-03-03
  • C++深度优先搜索的实现方法

    C++深度优先搜索的实现方法

    这篇文章主要介绍了C++深度优先搜索的实现方法,是数据结构中非常重要的一种算法,需要的朋友可以参考下
    2014-08-08
  • C语言详细分析不同类型数据在内存中的存储

    C语言详细分析不同类型数据在内存中的存储

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-08-08
  • C++读取文本文件中的汉字乱码情况原因及解决

    C++读取文本文件中的汉字乱码情况原因及解决

    本文介绍简体中文Windows操作系统中,C++读取文本文件中的汉字乱码情况原因及解决,文中通过代码和图文给大家介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-01-01
  • Qt QImage和QPixmap使用与区别

    Qt QImage和QPixmap使用与区别

    Qt中QImage类封装了对于一般图像像素级的操作,图像显示则使用QPixmap,本文主要介绍了Qt QImage和QPixmap使用与区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 手把手教你用C语言实现三子棋

    手把手教你用C语言实现三子棋

    三子棋是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。这篇文章就教你如何用C语言实现三子棋的功能
    2021-08-08
  • C++的静态成员变量和静态成员函数详解

    C++的静态成员变量和静态成员函数详解

    这篇文章主要为大家介绍了C++的静态成员变量和静态成员函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12

最新评论