Essential C++第四章课后作业

4.4
一份userprofile内含以下数据:登入记录、实际姓名、登入次数、猜过次数、猜对次数、等级–包括触及中级高级专家,以及猜对百分比。请写出一个名为userprofile的class,提供以下操作:输入,输出,相等测试,不等测试。其constructor必须邓工处理默认的用户等级,默认的登入名称guest。对于同样名为guest的多个用户,必须保证每个guest有他自己独有的登录会话(login session)。

//UserProfile.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS //报错说老方法_itoa()可能会照成内存泄漏

#include <iostream>
#include <string>
#include <map>
#include <cstdlib> //用到_itoa()

class UserProfile 
{
public:
	enum uLevel { Beginner, Intermediate, Advanced, Guru };//枚举类
	UserProfile(std::string login, uLevel = Beginner);
	UserProfile();//提供重载

	bool operator == (const UserProfile&);
	bool operator != (const UserProfile &rhs);//定义两种运算符

	//以下用来读取私有参数
	std::string login() const { return _login; }
	std::string user_name() const { return _user_name; }
	int login_count() const { return _time_logged; }
	int guess_count() const { return _guesses; }
	int guess_correct() const { return _correct_guesses; }
	double guess_average() const;
	std::string level() const;

	//以下用来写入私有数据
	void reset_login(const std::string &val) { _login = val; }
	void user_name(const std::string &val) { _user_name = val; }
	
	void reset_level(const std::string&);
	void reset_level(uLevel newlevel) { _user_level = newlevel; }

	void reset_login_count(int val) { _time_logged = val; }
	void reset_guess_count(int val) { _guesses = val; }
	void reset_guess_correct(int val) { _correct_guesses = val; }

	void bump_login_count(int cnt = 1) { _time_logged += cnt; }
	void bump_guess_count(int cnt = 1) { _guesses += cnt; }
	void bump_guess_correct(int cnt = 1) { _correct_guesses += cnt; }


private:
	std::string _login;
	std::string _user_name;
	int _time_logged;
	int _guesses;
	int _correct_guesses;
	uLevel _user_level;

	static std::map<std::string, uLevel> _level_map;
	static void init_level_map();
	//static std::string guest_login();
};

//定义猜对百分比
inline double UserProfile::guess_average() const
{
	return _guesses ? double(_correct_guesses) / double(_guesses) * 100 : 0.0;
}

//construct函数用来初始化object参数
inline UserProfile::UserProfile(std::string login, uLevel level) :_login(login), _user_level(level),
_time_logged(1), _guesses(0), _correct_guesses(0) {}

//提供重载construct函数
inline UserProfile::UserProfile() : _login("guest"), _user_level(Beginner),
_time_logged(1), _guesses(0), _correct_guesses(0) 
{
	static int id = 0;//静态id  id++后,下一个object的id累加
	char buffer[16];//16个字节的容器(一个char一个字节)

	_itoa(id++, buffer, 10);//_itoa(要转换的int,转换后的字符串存入的地方,进制)

	_login += buffer;
}

inline bool UserProfile::operator==(const UserProfile &rhs) 
{
	if (_login == rhs._login && _user_name == rhs._user_name)
		return true;
	return false;
}

inline bool UserProfile::operator!=(const UserProfile &rhs)
{
	return !(*this == rhs);
}

inline std::string UserProfile::level() const 
{
	static std::string _level_table[] = { "Beginner","Intermediate","Advanced","Guru" };
	return _level_table[_user_level];
}

//重写输出流
std::ostream& operator << (std::ostream &os, const UserProfile &rhs)
{//输出格式 stan1 beginner 12 100 10 10%
	os << rhs.login() << " " << rhs.level() << " " << rhs.login_count() << " "
		<< rhs.guess_count() << " " << rhs.guess_correct() << " " << rhs.guess_average() << std::endl;
	return os;
}

std::map<std::string, UserProfile::uLevel> UserProfile::_level_map;//定义level_map(传入实参)

//初始化level_map
void UserProfile::init_level_map() 
{
	_level_map["Beginner"] = Beginner;
	_level_map["Intermediate"] = Intermediate;
	_level_map["Advanced"] = Advanced;
	_level_map["Guru"] = Guru;
}

inline void UserProfile::reset_level(const std::string &level)
{
	std::map<std::string, uLevel>::iterator it;
	if (_level_map.empty())
		init_level_map();

	//在user中寻找,确保level是一个可识别的用户等级  it->second代表得到map的第二个位置的值
	_user_level = ((it = _level_map.find(level)) != _level_map.end() ? it->second : Beginner);
}

std::istream &operator >> (std::istream &is, UserProfile &rhs)
{
	std::string login, level;
	is >> login >> level;
	//以下是一系列初始化
	int lcount, gcount, gcorrect;
	is >> lcount >> gcount >> gcorrect;
	rhs.reset_login(login);
	rhs.reset_level(level);

	rhs.reset_login_count(lcount);
	rhs.reset_guess_count(gcount);
	rhs.reset_guess_correct(gcorrect);

	return is;

}

mian测试

#include "UserProfile.h"
#include <iostream>

int main()
{
	UserProfile anon;
	std::cout << anon;//测试输出符
	UserProfile anon_too;
	std::cout << anon_too;//测试是否得到唯一的标识符

	UserProfile anna("AnnaL", UserProfile::Guru);
	std::cout << anna;
	anna.bump_guess_count(27);
	anna.bump_guess_correct(25);
	anna.bump_login_count();
	std::cout << anna;

	std::cin >> anon;//测试输入符
	std::cout << anon;

}

补充一点,ASCII码,对应的字符是(Null),其实就是‘\0’,即空字符。判断一个字符串是否结束的标志就是看是否遇到‘\0’,如果遇到‘\0’,则表示字符串结束。
故buffer是一个可以存16位char的数组。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值