信用卡客户管理系统
基本要求:
信用卡信息:卡号、用户姓名、身份证号码、开户银行、信用额度、消费金额、信用积分(可能为负)等。
功能要求:
1、设计菜单实现功能选择;
2、能够对信用卡信息进行维护:新建、修改、删除操作;
3、能够对信用卡进行信用额度调整、信用积分兑换等工作;
4、按给定的条件(卡号、用户姓名、身份证号码、信用积分等)查询信息;
5、能将信用卡信息按卡号、信用额度、消费金额、信用积分这些信息项排序整理;
6、以文件形式保存相关信息,可以读取默认文件中的信息进行查询等操作。
7、考虑各项数据的合法性检查
信用卡客户管理系统(CMS)主要功能为:信用卡管理、链表管理、管理者,可以完成信用卡新建、修改、删除、查询等工作。
分别设计信用卡类(CreditCard)、卡组链表类(CreditCardList)、管理员类(CreditCardManager)实现通用的功能。
用文本文件进行数据的保存,需要保存的数据主要包括信用卡卡号、用户姓名、身份证号、开户银行、信用额度、消费金额、信用积分。设置数据操作类,实现所有的文本操作相关的功能。
一、具体类结构声明如下:
1.CreditCard类:
//"CreditCard.h"
#ifndef CREDITCARD_H
#define CREDITCARD_H
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
//定义信用卡类
class CreditCard {
private:
string cardNo; // 卡号
string userName; // 用户姓名
string idNo; // 身份证号码
string bankName; // 开户银行
double creditLimit; // 信用额度
double consumeAmount; // 消费金额
double creditScore; // 信用积分
public:
// 构造函数
CreditCard(string = "", string = "", string = "", string = "",
double = 0.0, double = 0.0, double = 0.0);
~CreditCard(){}
// 获取和设置信用卡属性
string getCardNo() const; //卡号
void setCardNo(const string& cardNo);
string getUserName() const; //用户名
void setUserName(const string& username);
string getIdNo() const; //身份证号码
void setIdNo(const string& idNo);
string getBankName() const; //开户银行
void setBankName(const string& bankName);
double getCreditLimit() const; // 信用额度
void setCreditLimit(double creditLimit);
double getConsumeAmount() const; // 消费金额
void setConsumeAmount(double consumeamount);
double getCreditScore() const; // 信用积分
void setCreditScore(double creditScore);
// 重载输出流运算符
friend ostream& operator<<(std::ostream& os, const CreditCard& card);
};
#endif // CREDITCARD_H
2.CreditCardList类:
// "CreditCardList.h"
#ifndef CREDITCARDLIST_H
#define CREDITCARDLIST_H
#include "CreditCard.h"
#include <sstream>
class CreditCardList {
public:
CreditCardList(); //默认构造
~CreditCardList(); //默认析构
int getSize() const; //获取长度
void display() const; //输出所有数据
//维护函数
void insertCard(CreditCard* card); // 插入信用卡
bool deleteCard(string cardNo); // 删除信用卡
void changeCard(string cardno); // 修改信用卡
//查找函数
CreditCard* findCardByCardNo(string cardno) const; // 按卡号查找信用卡
CreditCard* findCardByUserName(string username) const; // 按用户姓名查找信用卡
CreditCard* findCardByIdNo(string idno) const; // 按身份证号码查找信用卡
//排序函数
void sortByCardNo(); // 按卡号排序
void sortByCreditLimit(); // 按信用额度排序
void sortByConsumeAmount(); // 按消费金额排序
void sortByCreditScore(); // 按信用积分排序
//文件流函数
void saveToFile(string fileName) const; // 保存信息到文件
void loadFromFile(string fileName); // 加载信息从文件
private:
struct Node { //定义节点,作为结构体成员
CreditCard* data;
Node* next;
};
Node* head_; //头节点
int size; //节点个数
};
#endif //CREDITCARDLIST_H
3.CreditCardManager类:
//"CreditCardManager.h"
#ifndef CREDITCARDMANAGER_H
#define CREDITCARDMANAGER_H
#include "CreditCardList.h" //包括"CreditCardList.h"头文件
class CreditCardManager
{
public:
//文件流函数
void loadCards(string fileName); // 从文件中读取信用卡信息
void saveCards(string fileName); //保存信用卡信息到文件
//维护函数
void printCards(); // 打印所有信用卡的信息
void addCard(); // 添加一张新的信用卡
void removeCard(); // 删除指定卡号的信用卡
void change_card(); //修改指定卡号的信用卡
//查找函数
void search_by_card_no(); // 按卡号查找信用卡
void search_by_user_name(); // 按用户名查找信用卡
void search_by_id_no(); // 按身份证号查找信用卡
//排序函数
void sort_by_card_no(); // 按卡号排序
void sort_by_credit_limit(); // 按信用额度排序
void sort_by_consume_amount(); // 按消费金额排序
void sort_by_credit_score(); // 按信用积分排序
private:
CreditCardList cardList; //定义卡组链表作为成员
};
#endif //CREDITCARDMANAGER_H
二、类实现:
1.CreditCard类
#include "CreditCard.h"
// 构造函数
CreditCard::CreditCard(string cardno, string username, string idno, string bankname,
double creditlimit, double ConsumeAmount, double creditScore)
: cardNo(cardno), userName(username), idNo(idno), bankName(bankname), creditLimit(creditlimit),
consumeAmount(ConsumeAmount), creditScore(creditScore) {}
// 获取和设置信用卡属性
string CreditCard::getCardNo() const {
return cardNo;
}
void CreditCard::setCardNo(const std::string& cardNo) {
this->cardNo = cardNo;
}
string CreditCard::getUserName() const {
return userName;
}
void CreditCard::setUserName(const std::string& username) {
this->userName = username;
}
string CreditCard::getIdNo() const {
return idNo;
}
void CreditCard::setIdNo(const std::string& idNo) {
this->idNo = idNo;
}
string CreditCard::getBankName() const {
return bankName;
}
void CreditCard::setBankName(const std::string& bankName) {
this->bankName = bankName;
}
double CreditCard::getCreditLimit() const {
return creditLimit;
}
void CreditCard::setCreditLimit(double creditLimit) {
this->creditLimit = creditLimit;
}
double CreditCard::getConsumeAmount() const
{
return consumeAmount;
}
void CreditCard::setConsumeAmount(double consumeamount){
this->consumeAmount = consumeamount;
}
double CreditCard::getCreditScore() const {
return creditScore;
}
void CreditCard::setCreditScore(double creditscore) {
this->creditScore = creditscore;
}
// 重载输出流运算符,用于输出信息
ostream& operator<<(std::ostream& os, const CreditCard& card) {
os << "卡号:" << card.getCardNo()
<< ",\n用户姓名:" << card.getUserName()
<< ",\n身份证号码:" << card.getIdNo()
<< ",\n开户银行:" << card.getBankName()
<< ",\n信用额度:" << card.getCreditLimit()
<< ",\n消费金额:" << card.getConsumeAmount()
<< ",\n信用积分:" << card.getCreditScore() << endl;
return os;
}
2.CreditCardList类:
//"CreditCardList.cpp"
#include "CreditCardList.h"
// 重载默认构造函数
CreditCardList::CreditCardList()
{
head_ = nullptr;
size = 0;
}
// 重载默认析构函数
CreditCardList::~CreditCardList()
{
Node* current = head_; //从头节点开始
while (current != nullptr) { //遍历并释放所有节点空间
Node* _next = current->next;
delete current;
current = _next;
}
size = 0;
}
//获取链表长度
int CreditCardList::getSize() const
{
return size;
}
//输出链表所有节点数据
void CreditCardList::display() const
{
Node* current = head_;
while (current != nullptr) {
cout << *current->data; //输出该节点对应信用卡的所有数据
current = current->next; //转至下一节点
}
}
//插入节点
void CreditCardList::insertCard(CreditCard* card)
{
Node* newNode = new Node{ card,head_ }; //逆向建表
head_ = newNode;
size++;
}
//按卡号删除节点
bool CreditCardList::deleteCard(string cardNo)
{
Node* prev = nullptr; //前节点
Node* current = head_;
while (current != nullptr) {
if (current->data->getCardNo() == cardNo) {
if (prev == nullptr) { //找到的是第1个节点
head_ = current->next;
}
else { //正常情况
prev->next = current->next;
}
delete current;
size--;
return true;
}
prev = current;
current = current->next;
}
return false;
}
//修改卡片数据
void CreditCardList::changeCard(string cardno)
{
CreditCard* pos = findCardByCardNo(cardno); //查找定位当前信用卡
bool exit_while = false; //跳出 while 标记
while (pos != nullptr&&exit_while!=true) {
cout << "请选择: \n"
<< "1. 改卡号\n"
<< "2. 改姓名\n"
<< "3. 改身份证号码\n"
<< "4. 改开户银行\n"
<< "5. 改信用额度\n"
<< "6. 改消费金额\n"
<< "7. 改信用积分\n"
<< "0. 结束更改\n";
int choice;
cin >> choice;
switch (choice) { //匹配执行
case 1: //改卡号
{
cout << "原卡号:" << pos->getCardNo() << "\t请输入新卡号:";
string newcardno;
cin >> newcardno;
pos->setCardNo(newcardno);
break;
}
case 2: //改姓名
{
cout << "原姓名:" << pos->getUserName() << "\t请输入新姓名:";
string newusername;
cin >> newusername;
pos->setUserName(newusername);
break;
}
case 3: //改身份证号码
{
cout << "原身份证号:" << pos->getIdNo() << "\t请输入新身份证号:";
string newidno;
cin >> newidno;
pos->setIdNo(newidno);
break;
}
case 4: //改开户银行
{
cout << "原开户银行:" << pos->getBankName() << "\t请输入新开户银行:";
string newbankname;
cin >> newbankname;
pos->setUserName(newbankname);
break;
}
case 5: //改信用额度
{
cout << "原信用额度:" << pos->getCreditLimit() << "\t请输入新信用额度:";
double newcreditlimit;
cin >> newcreditlimit;
pos->setCreditLimit(newcreditlimit);
break;
}
case 6:
{
cout << "原消费金额:" << pos->getConsumeAmount() << "\t请输入新消费金额:";
double newconsumeamount;
cin >> newconsumeamount;
pos->setConsumeAmount(newconsumeamount);
break;
}
case 7: //改信用积分
{
cout << "原信用积分:" << pos->getCreditScore() << "\t请输入新信用积分:";
double newcreditscore;
cin >> newcreditscore;
pos->setCreditScore(newcreditscore);
break;
}
case 0: //退出 while
exit_while = true;
break;
default:
cout << "错误输入,请重试!\n";
}
}
}
//------------查找函数----------
//按卡号查找
CreditCard* CreditCardList::findCardByCardNo(string cardno) const
{
Node* current = head_;
while (current != nullptr) {
if (current->data->getCardNo() == cardno) {
return current->data;
}
current = current->next;
}
return nullptr;
}
//按姓名查找
CreditCard* CreditCardList::findCardByUserName(string username) const
{
Node* current = head_;
while (current != nullptr) {
if (current->data->getUserName() == username) {
return current->data;
}
current = current->next;
}
return nullptr;
}
//按身份证号查找
CreditCard* CreditCardList::findCardByIdNo(string idno) const
{
Node* current = head_;
while (current != nullptr) {
if (current->data->getIdNo() == idno) {
return current->data;
}
current = current->next;
}
return nullptr;
}
//-----------排序函数---------
//按卡号排序
void CreditCardList::sortByCardNo()
{
bool sorted = false;
while (!sorted) {
sorted = true; //排序完成标记
for (Node* current = head_; current != nullptr && current->next != nullptr; current = current->next) {
if (current->data->getCardNo() > current->next->data->getCardNo()) { //如果卡号比后节点大则交换卡片顺序
CreditCard* temp = current->data;
current->data = current->next->data;
current->next->data = temp;
sorted = false; //排序未完成
}
}
}
}
//按信用额度排序
void CreditCardList::sortByCreditLimit()
{
bool sorted = false;
while (!sorted) {
sorted = true; //排序完成标记
for (Node* current = head_; current != nullptr && current->next != nullptr; current = current->next) {
if (current->data->getCreditLimit() > current->next->data->getCreditLimit()) { //如果信用额度比后节点大则交换卡片顺序
CreditCard* temp = current->data;
current->data = current->next->data;
current->next->data = temp;
sorted = false;
}
}
}
}
//按消费金额排序
void CreditCardList::sortByConsumeAmount()
{
bool sorted = false;
while (!sorted) {
sorted = true; //排序完成标记
for (Node* current = head_; current != nullptr && current->next != nullptr; current = current->next) {
if (current->data->getConsumeAmount() > current->next->data->getConsumeAmount()) { //如果消费金额比后节点大则交换卡片顺序
CreditCard* temp = current->data;
current->data = current->next->data;
current->next->data = temp;
sorted = false; //排序未完成
}
}
}
}
//按信用积分排序
void CreditCardList::sortByCreditScore()
{
bool sorted = false;
while (!sorted) {
sorted = true; //排序完成标记
for (Node* current = head_; current != nullptr && current->next != nullptr; current = current->next) {
if (current->data->getCreditScore() > current->next->data->getCreditScore()) { //如果信用积分比后节点大则交换卡片顺序
CreditCard* temp = current->data;
current->data = current->next->data;
current->next->data = temp;
sorted = false; //排序未完成
}
}
}
}
//-----------文件函数-----------
//文件保存
void CreditCardList::saveToFile(string fileName) const
{
ofstream outfile(fileName); //文件流对象,以输出方式打开ASCII码文件
Node* current = head_;
while (current != nullptr) { //输出到文件
outfile<<current->data->getCardNo()<<'\t'
<< current->data->getUserName() << '\t'
<<current->data->getIdNo()<<'\t'
<<current->data->getBankName()<<'\t'
<< current->data->getCreditLimit() << '\t'
<< current->data->getConsumeAmount() << '\t'
<< current->data->getCreditScore() << endl;
current = current->next;
}
outfile.close();
}
//文件读取
void CreditCardList::loadFromFile(string fileName)
{
ifstream infile(fileName); //文件流对象,以输入方式打开ASCII码文件
string line;
while (getline(infile, line)) { //文件内容输入
stringstream ss(line); //字符串流
string card_no, user_name, id_no, bank_name;
double credit_limit, consumer_amount, credit_score;
ss >> card_no >> user_name >>id_no>>bank_name>> credit_limit >> consumer_amount >> credit_score;
CreditCard* card = new CreditCard(card_no, user_name,id_no,bank_name, credit_limit, consumer_amount, credit_score); //创建新的 CreditCard 对象
insertCard(card); //将新的卡片插入链表
}
infile.close();
}
3.CreditManager类:
//"CreditCardManager.h"
#include "CreditCardManager.h"
//读取
void CreditCardManager::loadCards(string fileName)
{
cardList.loadFromFile(fileName);
cout << "从文件 " << fileName << " 中读取了 " << cardList.getSize() << " 张信用卡信息。" << endl;
}
//保存
void CreditCardManager::saveCards(string fileName)
{
cardList.saveToFile(fileName);
}
//输出
void CreditCardManager::printCards()
{
cardList.display();
}
//添加
void CreditCardManager::addCard()
{
cout << "请输入要添加的信用卡信息(卡号、用户姓名、身份证号、开户银行、信用额度、已消费金额、信用积分):" << endl;
string card_no, user_name, id_no, bank_name;
double credit_limit, consumer_amount, credit_score;
cin >> card_no >> user_name >> id_no >> bank_name >> credit_limit >> consumer_amount >> credit_score;
CreditCard* card = new CreditCard(card_no, user_name, id_no, bank_name, credit_limit, consumer_amount, credit_score);
cardList.insertCard(card);
cout << "成功添加卡号为"<<card_no<<"的信用卡" << endl;
}
//删除
void CreditCardManager::removeCard()
{
cout << "请输入要删除的信用卡卡号:" << endl;
string cardNoToDelete;
cin >> cardNoToDelete;
if (cardList.deleteCard(cardNoToDelete)) {
cout << "删除成功!" << endl;
}
else {
cout << "未找到卡号为 " << cardNoToDelete << " 的信用卡!" << endl;
}
return ;
}
//修改
void CreditCardManager::change_card()
{
cout << "请输入要修改的信用卡卡号:" << endl;
string card_no;
cin >> card_no;
cardList.changeCard(card_no);
}
//按卡号查找
void CreditCardManager::search_by_card_no()
{
cout << "请输入要查找的卡号:";
string card_no;
cin >> card_no;
if (cardList.findCardByCardNo(card_no)) { //将输入值与链表里的值进行比对
cout << "查找成功,该卡信息如下:\n"
<<*cardList.findCardByCardNo(card_no); //输出查找结果
cout << "按1继续查找: ";
string choice = " "; //继续指令
cin >> choice;
if (choice == "1") {
search_by_card_no(); //继续调用该查找函数
}
else return;
}
else cout << "未找到该卡号!请重新输入:\n"; search_by_card_no(); //继续调用该函数
}
//按姓名查找
void CreditCardManager::search_by_user_name()
{
cout << "请输入要查找的姓名:";
string user_name;
cin >> user_name;
if (cardList.findCardByUserName(user_name)) { //将输入值与链表里的值进行比对
cout << "查找成功,该卡信息如下:\n"
<<*cardList.findCardByUserName(user_name); //输出查找结果
cout << "按1继续查找: ";
string choice = " "; //继续指令
cin >> choice;
if (choice == "1") {
search_by_user_name(); //继续调用该查找函数
}
else return;
}
else cout << "未找到该姓名!请重新输入:\n"; search_by_user_name(); //继续调用该函数
}
//按身份证号查找
void CreditCardManager::search_by_id_no()
{
cout << "请输入要查找的身份证号:";
string id_no;
cin >> id_no;
if (cardList.findCardByIdNo(id_no)) { //将输入值与链表里的值进行比对
cout << "查找成功,该卡信息如下:\n"
<< *cardList.findCardByIdNo(id_no); //输出查找结果
cout << "按1继续查找: ";
string choice = " "; //继续指令
cin >> choice;
if (choice == "1") {
search_by_id_no(); //继续调用该查找函数
}
else return;
}
else {
cout << "未找到该身份证号!请重新输入:\n"; search_by_id_no(); //继续调用该函数
}
}
//按卡号排序
void CreditCardManager::sort_by_card_no()
{
cardList.sortByCardNo();
cout << "排序完成,结果如下:\n";
cardList.display();
}
//按信用额度排序
void CreditCardManager::sort_by_credit_limit()
{
cardList.sortByCreditLimit();
cout << "排序完成,结果如下:\n";
cardList.display();
}
//按消费金额排序
void CreditCardManager::sort_by_consume_amount()
{
cardList.sortByConsumeAmount();
cout << "排序完成,结果如下:\n";
cardList.display();
}
//按信用积分排序
void CreditCardManager::sort_by_credit_score()
{
cardList.sortByCreditScore();
cout << "排序完成,结果如下:\n";
cardList.display();
}
三、主函数
// C++课程设计.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <fstream>
#include "CreditCard.h"
#include "CreditCardList.h"
#include "CreditCardManager.h"
using namespace std;
void menu();
int main() {
CreditCardManager manager;
string fileName = "CreditCardList.txt";
manager.loadCards(fileName); //读取文件
bool exitFlag = false; //退出循环标记
while (!exitFlag) {
menu(); //显示菜单
int choice;
cin >> choice;
switch (choice) { //匹配执行相应操作
case 1:
manager.printCards(); // 显示所有数据
break;
case 2:
manager.addCard(); //添加卡片
break;
case 3:
manager.removeCard(); //删除卡片
break;
case 4:
manager.change_card(); //修改卡片
break;
case 5:
manager.search_by_card_no(); //根据卡号查找
break;
case 6:
manager.search_by_user_name(); //根据姓名查找
break;
case 7:
manager.search_by_id_no(); //根据身份证号码查找
break;
case 8:
manager.sort_by_card_no(); // 通过卡号排序
break;
case 9:
manager.sort_by_credit_limit(); // 通过信用额度排序
break;
case 10:
manager.sort_by_consume_amount(); //通过消费金额排序
break;
case 11:
manager.sort_by_credit_score(); //通过信用积分排序
break;
case 0:
exitFlag = true; // 退出系统
break;
default:
cout << "错误输入,请重试!\n";
break;
}
manager.saveCards("CreditCardList.txt"); //保存到文件
system("pause");
system("cls");
}
cout << "谢谢使用!" << endl;
return 0;
}
void menu() {
cout<< "---------------信用卡管理系统--------------------" << endl;
cout << "1. 显示所有信用卡" << endl;
cout << "2. 添加信用卡" << endl;
cout << "3. 删除信用卡" << endl;
cout << "4. 修改信用卡" << endl;
cout << "5. 按卡号查找信用卡" << endl;
cout << "6. 按姓名查找信用卡" << endl;
cout << "7. 按身份证查找信用卡" << endl;
cout << "8. 按卡号给信用卡排序" << endl;
cout << "9. 按信用额度给信用卡排序" << endl;
cout << "10.按消费金额给信用卡排序" << endl;
cout << "11.按信用积分给信用卡排序" << endl;
cout << "0. 退出系统" << endl;
cout << "------------------------------" << endl;
cout << "请输入您的选择:";
}