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#include #include #include #include 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#include #include #include #include #include #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 > 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++项目开发全程实录》修改
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
下一篇:Mybatis判断空字符串的问题
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?