C++一篇解决大学课设所有**管理系统(增删查改)
文章目录
- C++一篇解决大学课设所有**管理系统(增删查改)
- 1.引言
- 1.1 使用结果展示
- 2. 基本原理
- 3. 文件层次结构
- 4.具体实现(通讯录管理系统为例)
- 4.1 通讯录实体类(addressbook.h)
- 4.2 通讯录实现类(addressbook.cpp)
- 4.3 通讯录管理类(zqymanager.h)
- 4.4 通讯录管理实现类(zqymanager.cpp)
- 4.4.1 menu()函数
- 4.4.2 findPersonDemo() 查找人员插件函数
- 4.4.3 findPerson(const std::string& strMsg) 查找人员函数
- 4.4.4 添加人员函数 addPerson() 添加人员函数
- 4.4.5 deletePerson() 删除人员函数
- 4.4.6 modifyPerson(const std::string& strName) 修改人员函数
- 4.4.7 loadContactsFromFile() 加载文件
- 4.4.8 resaveCOntactsToFile() 重新写入文件函数
- 4.5 main.cpp
- 5. 简便操作*
1.引言
话不多说,先看我的任务的需求跟你的是否一致。
(以通讯录管理系统为例),如果你的课设跟以上要求某某管理系统类似的话,也是要求增删查改的话,那么恭喜你刷到此文章。因为所有的大学课设管理系统的套路都是基本一致的。本篇作者将以在实际公司内实际实习考核为参考给大家介绍一份相对规范的管理系统。
本篇是默认存到文件里进行永久读取保存的,如果只是想读入内存一次性的使用,不想这么麻烦,那么请看最后一节。
1.1 使用结果展示
做完后能达一种什么样的结果呢? 直接上截图:
增加:
删除:
查找:
修改:
2. 基本原理
这类课设所有核心思路都是:在类vector的序列中存放管理实体对象。例如:
然后所有的增删查改都是在对里面的对象元素进行修改,从而达到一种管理效果。
3. 文件层次结构
这次实现我们采用面向对象思路:通过对应头文件里面放函数声明和相关的.cpp文件来具体实现函数,在main.cpp中只用调用一下对象即可. 例如(以通讯录管理系统为例):
4.具体实现(通讯录管理系统为例)
4.1 通讯录实体类(addressbook.h)
首先要创建通讯录管理系统,你首先得有一个通讯录吧?,在该类中需要声明(注意只是声明,函数的具体实现放在addressbook.cpp中)所有成员函数和成员变量。那么我们在类中规定通讯录有三种基本元素:姓名、号码、地址。 然后把这三种元素放入private中,public里面要写:获取元素的函数(如:getName() )和设置元素(如: setName() )的函数方便后续修改内容:那么你写完代码后跟我对对,应该有以下内容:
#ifndef __ADDRESSBOOK__
#define __ADDRESSBOOK__
#include<string>
class ZqyAddressBook
{
public:
ZqyAddressBook() {}
ZqyAddressBook(const std::string& strName, //构造
const std::string& strNumber,
const std::string& strAddress)
:m_strName(strName)
, m_strNumber(strNumber)
, m_strAddress(strAddress)
{}
//修改成员函数
void setName(const std::string& strName);
void setNumber(const std::string& strNumber);
void setAddress(const std::string& strAddress);
//获取成员函数
std::string& getName();
std::string& getNumber();
std::string& getAddress();
private:
std::string m_strName; //姓名
std::string m_strNumber;//号码
std::string m_strAddress;//地址
};
4.2 通讯录实现类(addressbook.cpp)
那么我们这个类里面的函数就是实现上述声明的函数,没什么难的,直接上代码:
#include"addressbook.h"
void ZqyAddressBook::setName(const std::string& strName) { m_strName = strName; }
void ZqyAddressBook::setNumber(const std::string& strNumber) { m_strNumber = strNumber; }
void ZqyAddressBook::setAddress(const std::string& strAddress) { m_strAddress = strAddress; }
std::string& ZqyAddressBook::getName() { return m_strName; }
std::string& ZqyAddressBook::getNumber() { return m_strNumber; }
std::string& ZqyAddressBook::getAddress() { return m_strAddress; }
4.3 通讯录管理类(zqymanager.h)
有了通讯录,我们就开始对通讯录进行增删查改的管理了。在这里创建一个管理类,里面写上增删查改
1.私有成员private: vector m_vecContainer //使用vector存储通讯里对象
2.公有成员public: void menu() // 菜单函数
size_t findPerson(const std::string& strName);// 查找人员
bool addPerson();//添加人员
bool deletePerson();//删除人员
bool modifyPerson(const std::string& strName); //修改人员
size_t findPersonDemo(const std::string& strName); // 查找人员插件,用于增删查里面判断存在
//读入文件相关
void loadContactsFromFile();//加载文件
void resaveContactsToFile();//重新写入数据,因为删除了某个元素
#ifndef __ZQYMANAGER__
#define __ZQYMANAGER__
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<map>
#include"addressbook.h"
class ZqyManager
{
public:
ZqyManager() {}
void menu();
~ZqyManager() {}
void loadContactsFromFile();//加载文件
void resaveContactsToFile();//重新写入数据,因为删除了某个元素
size_t findPersonDemo(const std::string& strName); // 查找人员插件
size_t findPerson(const std::string& strName);// 查找人员
bool addPerson();//添加人员
bool deletePerson();//删除人员
bool modifyPerson(const std::string& strName); //修改人员
private:
std::vector<ZqyAddressBook> m_vecContainer; //vector存储对象
};
4.4 通讯录管理实现类(zqymanager.cpp)
在这个类里面我们具体实现上述声明出来的函数:
4.4.1 menu()函数
先看代码:我们通过读入用户输入的12345,再通过switch语句来确定我们要调用什么函数
void ZqyManager::menu()
{
while (true)
{
std::cout << " " << std::endl;
std::cout << "****************************" << std::endl;
std::cout << "*******1.添加联系人*********" << std::endl;
std::cout << "*******2.删除联系人*********" << std::endl;
std::cout << "*******3.查找联系人*********" << std::endl;
std::cout << "*******4.修改联系人*********" << std::endl;
std::cout << "*******5.保存并退出通讯录*********" << std::endl;
std::cout << "****************************" << std::endl;
std::cout << "请输入你的选项:";
std::string strChoice; //输入类型从int改为string类型,防止std::cin >> int输入string字符串而出现BUG的问题
std::cin >> strChoice;
std::cout << " " << std::endl;
E_Choice eUserChoice = it->second; //改成枚举类型方便下方case理解和维护
switch (strChoice)
{
case '1':
{
addPerson(); //增加函数
break;
}
case '2':
{
deletePerson();
break;
}
case '3':
{
std::string strName;
std::cout << "请输入您要查询的人员信息:";
std::cin >> strName;
if (findPerson(strName) == -1) //如果调用查找人员插件函数,没找到的话
{
std::cout << "查无此人" << std::endl;
}
break;
}
case '4':
{
std::string strName;
std::cout << "请输入您要修改的人姓名:";
std::cin >> strName;
modifyPerson(strName); //调用修改函数
break;
}
case '5':
{
resaveContactsToFile(); //读入内存函数
std::cout << "感谢使用,再见!" << std::endl;
std::exit(EXIT_SUCCESS);
}
default:
std::cout << "输入非法,再次输入" << std::endl;
break;
}
}
}
}
4.4.2 findPersonDemo() 查找人员插件函数
这个函数是为了在增删改的函数里面判断到底存不存在此人的情况而出现。也就是为了别的函数调用的
size_t ZqyManager::findPersonDemo(const std::string& strName) // 查找人员插件
{
for (size_t i = 0; i < m_vecContainer.size(); i++)
{
if (m_vecContainer[i].getName() == strName)
{
return i;
}
}
return -1; //返回值为-1 代表不存在
}
4.4.3 findPerson(const std::string& strMsg) 查找人员函数
这个才是正儿八经的查找人员函数了,其实代码大差不差。
{
std::vector<ZqyAddressBook> vecTemp;
for (auto& it : m_vecContainer)
{
if (it.getName().find(strMsg) != std::string::npos ||
it.getNumber().find(strMsg) != std::string::npos ||
it.getAddress().find(strMsg) != std::string::npos)
{
vecTemp.push_back(it);
}
}
if (vecTemp.empty())
{
return -1; //临时vector为空说明一个满足的都没有:查无此人
}
else
{
for (auto& it : vecTemp) //输出临时变量中的对象
{
std::cout << "找到此人:" << it.getName() << " "
<< it.getNumber() << " " << it.getAddress() << std::endl;
}
return 0;
}
}
4.4.4 添加人员函数 addPerson() 添加人员函数
bool ZqyManager::addPerson() //添加人员
{
std::string strName, strNumber, strAddress;
std::cout << "请输入您要添加的人员姓名:";
std::cin >> strName;
std::cout << "请输入您要添加的人员号码:";
std::cin >> strNumber;
std::cout << "请输入您要添加的人员地址:";
std::cin >> strAddress;
if (findPersonDemo(strName) != -1) //判断添加人员是否存在
{
std::cout << "姓名已存在,不保存" << std::endl;
return false;
}
ZqyAddressBook b(strName, strNumber, strAddress);
m_vecContainer.push_back(b);
std::cout << "人员添加成功!" << std::endl;
return true;
}
4.4.5 deletePerson() 删除人员函数
bool ZqyManager::deletePerson() //删除人员
{
std::string strName;
std::cout << "请输入您要删除的人员姓名:";
std::cin >> strName;
size_t iTmp = findPersonDemo(strName);
if (iTmp != -1)
{
m_vecContainer.erase(m_vecContainer.begin() + findPersonDemo(strName));
std::cout << "删除成功! " << std::endl;
return true;
}
std::cout << "没找到这人,删除失败" << std::endl;
return false;
}
4.4.6 modifyPerson(const std::string& strName) 修改人员函数
bool ZqyManager::modifyPerson(const std::string& strName)
{
if (findPersonDemo(strName) != -1) //找到了
{
std::string strNewName, strNewNumber, strNewAddress;
std::cout << "请输入您要修改成什么名字:";
std::cin >> strNewName;
std::cout << "请输入您要修改成什么号码:";
std::cin >> strNewNumber;
std::cout << "请输入您要修改成什么地址:";
std::cin >> strNewAddress;
for (auto& it : m_vecContainer)
{
if (it.getName() == strName)
{
it.setName(strNewName);
it.setNumber(strNewNumber);
it.setAddress(strNewAddress);
std::cout << "修改成功!!" << std::endl;
return true;
}
}
}
std::cout << "没找到此联系人,无法修改" << std::endl;
return false;
}
4.4.7 loadContactsFromFile() 加载文件
通过文件流ifstream来读取文件
void ZqyManager::loadContactsFromFile() //加载文件
{
std::ifstream file("booktest.txt");
if (!file.is_open())
{
// 文件不存在,创建一个新文件
std::ofstream createFile("booktest.txt");
createFile.close();
// 重新尝试打开文件
file.open("booktest.txt");
}
if (file.is_open())
{
ZqyAddressBook object;
while (file >> object.getName() >> object.getNumber() >> object.getAddress())
{
m_vecContainer.push_back(object);
}
file.close();
}
}
4.4.8 resaveCOntactsToFile() 重新写入文件函数
我们光加载进文件后还不够,因为每次增删查改后还要重新更新文件数据
void ZqyManager::resaveContactsToFile() //重新写入数据
{
std::ofstream file("booktest.txt");
if (file.is_open())
{
for (auto& it : m_vecContainer)
{
file << it.getName() << " " << it.getNumber() << " "
<< it.getAddress() << "\n";
}
file.close();
}
}
4.5 main.cpp
在主函数中我们只用创建对象,然后调用加载文件函数、菜单函数和重新写入文件函数就够了。
#include"addressbook.h"
#include"zqymanager.h"
int main()
{
ZqyManager test;
test.loadContactsFromFile(); //加载文件函数
test.menu(); //调用菜单函数,读取到用户输入后自动执行增删查改
test.resaveContactsToFile(); //重新读取函数
return 0;
}
5. 简便操作*
如果不想读入写入文件这么麻烦的话,就取消掉loadContacksFromFile()加载文件和resaveCOntactsToFile() 重新写入文件函数,并且在main中注释掉就ok了。
其实只在一次执行的内存中读取就已经能够满足大学管理系统课设的基本要求了!