这篇“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++项目开发如何实现图书管理系统”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。