c++快捷店会员管理系统

设计快捷店会员的简单管理系统。基本要求如下:

(1)定义人民币RMB类(数据成员包括元,角,分三个整型变量),实现人民币的基本运算(对操作符+和-运算进行重载)和显示(显示元,角,分)。

(2)定义会员member类,表示会员的基本信息,包括:编号(按建立会员的顺序自动生成),姓名,密码,电话。提供输入、输出信息等功能。

(3)由RMB类和member类共同派生一个会员卡memberCar类(含有memberCar类型next指针变量),提供新建会员、充值、消费和查询余额等功能。

(4)main函数定义一个memberCar类链表,保存会员卡,模拟一个快捷店的会员卡管理功能,主要包括:

(1) 新建会员(检查输入的会员电话号码是否已经存在;若存在,则表示已经有该会员,需要重新输入会员信息),则为该会员建立会员卡,将该会员卡所表示的对象插入memberCar类链表表尾;

(2) 已有会员充值(需要对充值进行非负性检查);

(3) 已有会员消费(凭密码,不能透支);

(4) 输出快捷店当前会员数,当前所有会员的消费总额,所有会员卡剩余的额度总数;

(5) 遍历链表,输出所有会员卡的信息(不能输出会员个人密码);

(6) 建立一个文本文件“member.txt”,将所有会员信息存入该文件中;

(7) 建立一个二进制文件“member.dat” ,将所有会员信息存入该文件中;

(8) 建立指针数组,初始化指针数组,存储链表中每个会员对象的地址;对链表中的每个会员按照消费额度按照从小到大进行排序(要求不能改变链表的逻辑结构),并将排序后的会员对象的地址存在指针数组中;

(9) 利用(8)中的指针数组,在屏幕上输出会员的排序结果。

RMB头文件:

#pragma once
#include <iostream>
using namespace std;

class RMB {
public:
	static double tCost;
	int m_Yuan;
	int m_Jiao;
	int m_Fen;
	RMB();
	RMB& operator+(double rmb);
	RMB& operator-(double rmb);
	void show();
};

RMB源文件

#include "RMB.h"

double RMB::tCost = 0;
RMB::RMB() {
	m_Yuan = 0;
	m_Jiao = 0;
	m_Fen = 0;
}
RMB& RMB::operator+(double rmb) {
	int yuan = ((int)(rmb * 100)) / 100;
	int jiao = ((int)(rmb * 10)) % 10;
	int fen = ((int)(rmb * 100)) % 10;
	this->m_Yuan += yuan;
	this->m_Jiao += jiao;
	this->m_Fen += fen;
	return *this;
}
RMB& RMB::operator-(double rmb) {
	int yuan = ((int)(rmb * 100)) / 100;
	int jiao = ((int)(rmb * 10)) % 10;
	int fen = ((int)(rmb * 100)) % 10;
	this->m_Yuan -= yuan;
	this->m_Jiao -= jiao;
	this->m_Fen -= fen;
	return *this;
}
void RMB::show() {
	cout << "您的余额为:" << this->m_Yuan << "元" << this->m_Jiao << "角" << this->m_Fen << "分" << endl;
}

member头文件

#pragma once
#include <iostream>
#include <string>
using namespace std;

class member {
public:
	static long preId;
	long m_id;
	string m_Name;
	string m_Passport;
	string m_PhoneNumber;
	member();
	void inIft();
	void outIft();
};

member源文件

#include "member.h"

long member::preId = -1L;
member::member() {
	this->m_id = preId + 1;
	preId = this->m_id;
}
void member::inIft() {
	string name;
	cout << "请输入您的姓名:";
	cin >> name;
	this->m_Name = name;
	cout << endl;
	string passport;
	cout << "请输入您的密码:";
	cin >> passport;
	this->m_Passport = passport;
	cout << endl;
	string phoneNum;
	cout << "请输入您的电话:";
	cin >> phoneNum;
	this->m_PhoneNumber = phoneNum;
	cout << endl;
}
void member::outIft() {
	cout << "编号:" << m_id << " 姓名:" << m_Name << " 密码:" << m_Passport << " 电话:" << m_PhoneNumber << endl;
}

memberCard头文件

#pragma once
#include <iostream>
#include "RMB.h"
#include "member.h"
using namespace std;

class memberCard:public RMB,public member{
public:
	static int num_;
	memberCard* next;
	double Con = 0;
	memberCard();
	void create();
	void deposit();
	void consume();
	void balanceCheck();
	~memberCard();
};

memberCard源文件

#include "memberCard.h"

int memberCard::num_ = -1;
memberCard::memberCard() {
	num_++;
	this->next = NULL;
}
void memberCard::create() {
	inIft();
}
void memberCard::deposit() {
	cout << "请输入充值的金额:";
	double money;
	cin >> money;
	cout << endl;
	if (money < 0) {
		cout << "充值金额不能为负!" << endl;
		return;
	}
	this->operator+(money);
}
void memberCard::consume() {
	cout << "请输入消费金额:";
	double money;
	cin >> money;
	Con += money;
	cout << endl;
	cout << "请输入密码:";
	string passport;
	cin >> passport;
	if (strcmp(passport.c_str(), m_Passport.c_str()) == 0) {
		if (((int)(money * 100)) / 100 > m_Yuan) {
			cout << "余额不足!" << endl;
			return;
		}
		else if (((int)(money * 100)) / 100 == m_Yuan) {
			if (((int)(money * 10)) % 10 > m_Jiao) {
				cout << "余额不足!" << endl;
				return;
			}
			else if (((int)(money * 10)) % 10 == m_Jiao) {
				if (((int)(money * 100)) % 10 > m_Fen) {
					cout << "余额不足!" << endl;
					return;
				}
			}
		}
		this->operator-(money);
		RMB::tCost += money;
	}
	else {
		cout << "密码错误!" << endl;
		return;
	}
}
void memberCard::balanceCheck() {
	this->show();
}
memberCard::~memberCard() {
	if (this->next != NULL) {
		delete this->next;
		this->next = NULL;
	}
}

主函数

#include <iostream>
#include "RMB.h"
#include "member.h"
#include "memberCard.h"
#include <string>
#include <fstream>
using namespace std;

#define FILENAME1 "member.txt"
#define FILENAME2 "member.dat"
void AddMember(memberCard*& head, memberCard*& pre) {
	if (head == NULL) {
		head = new memberCard;
		pre = head;
		return;
	}
	memberCard* p = new memberCard;
	p->create();
	p->next = NULL;
	pre->next = p;
	pre = p;
	cout << "添加成功!" << endl;
	system("pause");
}
bool check(memberCard*& head, memberCard*& pre) {
	if (head == NULL) {
		return false;
	}
	cout << "请输入要办理会员的电话号:";
	string phoneNum;
	cin >> phoneNum;
	cout << endl;
	memberCard* p = head->next;

	while (p != NULL) {
		if (strcmp(phoneNum.c_str(), p->m_PhoneNumber.c_str()) == 0) {
			cout << "该手机号已有会员!" << endl;
			system("pause");
			return true;
		}
		p = p->next;
	}
	return false;
}
void deposit_(memberCard* head) {
	if (head == NULL) {
		return;
	}
	memberCard* p = head->next;
	cout << "请输入要充值的会员卡手机号:" << endl;
	string phoneNum;
	cin >> phoneNum;
	while (p != NULL) {
		if (strcmp(phoneNum.c_str(), p->m_PhoneNumber.c_str()) == 0) {
			p->deposit();
			cout << "充值成功!" << endl;
			system("pause");
			return;
		}
		p = p->next;
	}
	cout << "未查询到会员卡!" << endl;
	system("pause");
}
void consume_(memberCard* head) {
	if (head == NULL) {
		return;
	}
	cout << "请输入要消费的会员手机号:" << endl;
	string phoneNum;
	cin >> phoneNum;
	memberCard* p = head->next;
	while (p != NULL) {
		if (strcmp(phoneNum.c_str(), p->m_PhoneNumber.c_str()) == 0) {
			p->consume();
			
			return;
		}
		p = p->next;
	}
	cout << "未查询到会员卡!" << endl;
	system("pause");
}
void total(memberCard* head) {
	if (head == NULL) {
		return;
	}
	memberCard* p = head->next;
	int sum = 0;
	double totalBalance = 0;
	while (p != NULL) {
		sum++;
		double balance = p->m_Yuan * 1.0 + p->m_Jiao * 0.1 + p->m_Fen * 0.01;
		totalBalance += balance;
		p = p->next;
	}
	cout << "快捷店当前会员数为:" << sum << endl;
	cout << "当前所有会员的消费总额为:" << p->tCost << endl;
	cout << "所有会员卡剩余额度总数为:" << totalBalance << endl;
	system("pause");
}
void display(memberCard*& head) {
	if (head == NULL) {
		cout << "无任何会员卡" << endl;
		return;
	}
	memberCard* p = head->next;
	while (p != NULL) {
		double balance = p->m_Yuan * 1.0 + p->m_Jiao * 0.1 + p->m_Fen * 0.01;
		cout << "id:" << p->m_id << " 姓名:" << p->m_Name << " 电话:" << p->m_PhoneNumber << " 余额:" <<balance << endl;
		p = p->next;
	}
	system("pause");
}
void save(memberCard*& head) {
	if (head == NULL) {
		return;
	}
	ofstream oft;
	oft.open(FILENAME1, ios::out);

	memberCard* p = NULL;
	p = head->next;
	while (p != NULL) {
		oft<< p->m_id << " " << p->m_Name << " " << p->m_Passport << " " << p->m_PhoneNumber << " " << p->m_Yuan << " " << p->m_Jiao << " " <<p->m_Fen<< " " << p->preId<< " " << p->tCost<< endl; //<< "会员总人数:" << p->num_
		p = p->next;
	}
	oft.close();
}
void save2(memberCard* head) {
	if (head == NULL) {
		return;
	}
	ofstream oft;
	oft.open(FILENAME2, ios::binary | ios::out);
	memberCard* p = head->next;
	while (p != NULL) {
		oft.write((const char*)&p, sizeof(memberCard));
		p = p->next;
	}
	cout << "保存成功!" << endl;
	system("pause");
}
void readFile() {
	ifstream ifs;
	ifs.open(FILENAME1, ios::in);
	if (ifs.is_open()) {
		char buf[1024] = { 0 };
		while (ifs >> buf) {
			cout << buf << endl;
		}
	}
	ifs.close();
	system("pause");
}
void toArray(memberCard* head,memberCard**& arr) {
	/*memberCard** arr = new memberCard*[memberCard::num_];*/
	memberCard* p = head->next;
	int index = 0;
	while (p != NULL) {
		arr[index] = p;
		index++;
		p = p->next;
	}
	for (int i = 0; i < memberCard::num_; i++) {
		for (int j = i + 1; j < memberCard::num_; j++) {
			if (arr[i]->Con > arr[j]->Con) {
				memberCard* temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}
}

int main() {
	memberCard* head = NULL;
	memberCard* pre = NULL;
	FileIsEmpty(head,pre);
	while (true) {

		cout << "*************************************" << endl;
		cout << "*********快捷店会员管理系统**********" << endl;
		cout << "************1.新建会员***************" << endl;
		cout << "***********2.已有会员充值************" << endl;
		cout << "***********3.已有会员消费************" << endl;
		cout << "*******4.输出快捷店当前会员数********" << endl;
		cout << "*******当前所有会员的消费总额********" << endl;
		cout << "*******所有会员卡剩余的额度总数******" << endl;
		cout << "********5.输出所有会员卡的信息*******" << endl;
		cout << "****6.采用二进制方式保存会员信息*****" << endl;
		cout << "******7.读取文件中所有会员信息*******" << endl;
		cout << "**8.用数组存储地址,并按消费额度排序*" << endl;
		cout << "*************************************" << endl;
		int d_select;
		cout << "请输入您的选择:" << endl;
		cin >> d_select;

		switch (d_select) {
		case 1:
		{
			if (check(head,pre)) {
				break;
			}
			AddMember(head, pre);
			break;
		}
		case 2:
			deposit_(head);
			break;
		case 3:
			consume_(head);
			break;
		case 4:
			total(head);
			break;
		case 5:
			display(head);
			break;
		case 6:
			save2(head);
			break;
		case 7:
			readFile();
			break;
		case 8:
		{
			memberCard** arr = new memberCard * [memberCard::num_];
			toArray(head, arr);
			for (int i = 0; i < memberCard::num_; i++) {
				double balance = arr[i]->m_Yuan * 1.0 + arr[i]->m_Jiao * 0.1 + arr[i]->m_Fen * 0.01;
				cout << "id:" << arr[i]->m_id << " 姓名:" << arr[i]->m_Name << " 电话:" << arr[i]->m_PhoneNumber << " 余额:" << balance << endl;
			}
			system("pause");
			break;
		}
		}
		save(head);
		system("cls");
	}

	
	system("pause");
	return 0;
}

 

 

 

  • 8
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值