2019-02-11

Hyeonu_Chun·2021년 6월 21일
0

HW15

#include <iostream>
#include <cstring>
#pragma warning (disable : 4996)
using namespace std;

// Fitness.h
class Fitness {
private:
	int num;
	char *name;
	double weight;
	double height;
public:
	// 생성자
	Fitness();
	Fitness(int num, const char *name, double weight, double height);
	Fitness(Fitness &r);
	~Fitness();
	// 연산자
	Fitness &operator=(Fitness &r);
	bool operator==(Fitness &r);
	// setter, getter
	void setNum(int num);
	int getNum();
	void setName(const char *name);
	char *getName();
	void setWeight(double weight);
	double getWeight();
	void setHeight(double height);
	double getHeight();
	// 기타멤버함수
	double bmi();
};

// Fitness.cpp
Fitness::Fitness() {
	this->num = 0;
	this->name = new char[1];
	strcpy(this->name, "");
	this->weight = 0;
	this->height = 0;
}

Fitness::Fitness(int num, const char *name, double weight, double height) {
	if (this->name != NULL) {
		if (name != NULL) {
			this->name = new char[strlen(name) + 1];
			strcpy(this->name, name);
		}
	}
	else return;
	this->num = num;
	this->weight = weight;
	this->height = height;
}

Fitness::Fitness(Fitness &r) {
	if (name != NULL) {
		this->name = new char[strlen(r.name) + 1];
		strcpy(this->name, r.name);
	}
	else return;
	this->num = r.num;
	this->weight = r.weight;
	this->height = r.height;
}

Fitness::~Fitness() {
	if (name != NULL) {
		strcpy(this->name, "");
		delete[] this->name;
	}
	else return;
	this->num = 0;
	this->weight = 0;
	this->height = 0;
	//cout << "소멸 성공" << endl;
}

Fitness &Fitness::operator=(Fitness &r) {
	if (*this == r) return *this;
	strcpy(this->name, "");
	delete[] this->name;
	this->name = new char[strlen(r.name) + 1];
	strcpy(this->name, r.name);
	this->num = r.num;
	this->weight = r.weight;
	this->height = r.height;
	return *this;
}

bool Fitness::operator==(Fitness &r) {
	if (this->num == r.num) {
		return 1;
	}
	if (r.name != NULL) {
		if (strcmp(this->name, r.name) == 0) {
			return 1;
		}
	}
	return 0;
}

void Fitness::setNum(int num) {
	this->num = num;
}

int Fitness::getNum() {
	return this->num;
}

void Fitness::setName(const char *name) {
	if (this->name != NULL) {
		if (name != NULL) {
			strcpy(this->name, "");
			delete[] this->name;
			this->name = new char[strlen(name) + 1];
			strcpy(this->name, name);
		}
	}
}

char *Fitness::getName() {
	return this->name;
}

void Fitness::setWeight(double weight) {
	this->weight = weight;
}

double Fitness::getWeight() {
	return this->weight;
}

void Fitness::setHeight(double height) {
	this->height = height;
}

double Fitness::getHeight() {
	return this->height;
}

double Fitness::bmi() {
	return this->weight / (this->height * this->height) * 10000;
}

// main.cpp
int menu(const char **menuList, int menuCnt);
void memInput(Fitness **br, int &memNum, int &memCnt, int &dataCnt);
void memPrint(Fitness **br, int memCnt);
void memFind(Fitness **br, int memCnt);
void memDelete(Fitness **br, int &memNum, int &memCnt, int &dataCnt);
void memBmi(Fitness **br, int &memCnt);
void myflush();

int main() {
	const char *menuList[] = { "회원등록", "회원전체보기", "회원정보검색", "회원탈퇴" , "특별관리회원","종료" };
	int menuCnt, menuNum, memNum = 1, memCnt = 0, dataCnt = 0;

	Fitness *fary[100] = { 0, };

	menuCnt = sizeof(menuList) / sizeof(menuList[0]);

	while(1)
	{
		menuNum = menu(menuList, menuCnt);
		if (menuNum == menuCnt)
		{
			break;
		}
		switch (menuNum)
		{
		case 1: memInput(fary, memNum, memCnt, dataCnt); cout << endl; break;
		case 2: memPrint(fary, memCnt); cout << endl;  break;
		case 3: memFind(fary, memCnt); cout << endl;  break;
		case 4: memDelete(fary, memNum, memCnt, dataCnt); cout << endl; break;
		case 5: memBmi(fary, memCnt); cout << endl; break;
		}
	}
	for (int i = 0;i < dataCnt;i++) {
		delete[] fary[i];
	}
	return 0;
}

int menu(const char **menuList, int menuCnt)
{
	int menuNum = 0;
	for (int i = 0; i < menuCnt; i++)
	{
		cout << i + 1 << "." << menuList[i] << " / ";
	}
	cout << "\b\b \n";
	while (menuNum<1 || menuNum>menuCnt)
	{
		cout << "# 메뉴번호를 입력하세요 : ";
		cin >> menuNum;
		while (cin.fail()) {
			cin.clear();
			myflush();
			cout << "* 잘못된 메뉴번호 입니다." << endl << "# 메뉴번호를 입력하세요 : ";
			cin >> menuNum;
		}
		myflush();
	}
	return menuNum;
}

void memInput(Fitness **br, int &memNum, int &memCnt, int &dataCnt) {
	double weight, height;
	char temp[30];
	cout << "\n* 회원 입력 메뉴" << endl;
	while (1) {
		cout << "\n회원 성명(종료) : ";
		cin.getline(temp, sizeof(temp));
		if (strcmp(temp, "종료") == 0) break;
		if (br[memCnt] == NULL) {
			br[memCnt] = new Fitness[1];
			br[memCnt]->setNum(memNum);
			dataCnt++;
		}
		cout << "회원 번호 : " << br[memCnt]->getNum() << "번" << endl;
		br[memCnt]->setName(temp);
		cout << "회원 몸무게(kg) : ";
		cin >> weight;
		cout << "회원 키(cm) : ";
		cin >> height;
		myflush();
		br[memCnt]->setWeight(weight);
		br[memCnt]->setHeight(height);
		memCnt++;
		memNum = memCnt + 1;
	}
}

void memPrint(Fitness **br, int memCnt) {
	cout << "\n* 회원 전체 보기" << endl << endl;
	for (int i = 0;i < memCnt;i++) {
		cout << br[i]->getNum() << "번 - " << br[i]->getName() << "님, 키(cm) : " << br[i]->getHeight() << ", 몸무게(kg) : " << br[i]->getWeight() << endl;
	}
}

void memFind(Fitness **br, int memCnt) {
	int num = 0;
	char temp[30];
	cout << "\n* 회원 정보 검색 메뉴" << endl << "\n회원 성명 : ";
	cin >> temp;
	for (int i = 0;i < memCnt;i++) {
		if (strcmp(br[i]->getName(), temp) == 0) {
			cout << br[i]->getNum() << "번 - " << br[i]->getName() << "님, 키(cm) : " << br[i]->getHeight() << ", 몸무게(kg) : " << br[i]->getWeight() << endl;
			num++;
		}
	}
	if (num == 0) cout << "* 등록되지 않은 회원입니다." << endl;
}

void memDelete(Fitness **br, int &memNum, int &memCnt, int &dataCnt) {
	int num;
	char temp[10];
	cout << "\n* 회원 탈퇴 메뉴" << endl;
	while (1) {
		cout << "\n회원 번호(종료) : ";
		cin >> num;
		while (cin.fail()) {
			cin.clear();
			cin.getline(temp, sizeof(temp));
			if (strcmp(temp, "종료") == 0) return;
			else {
				cout << "* 잘못된 회원번호 입니다." << endl << endl << "회원 번호 : ";
				cin >> num;
			}
		}
		myflush();
		if (num <= dataCnt) {
			int cnt = 0;
			for (int i = 0;i < memCnt;i++) {
				if (br[i]->getNum() == num) {
					cnt++;
					cout << br[i]->getNum() << "번 - " << br[i]->getName() << "님, 키(cm) : " << br[i]->getHeight() << ", 몸무게(kg) : " << br[i]->getWeight() << endl;
					cout << "* 삭제하시겠습니까?(네/아니오) : ";
					cin.getline(temp, sizeof(temp));
					if (strcmp(temp, "네") == 0) {
						int num = br[i]->getNum();
						cout << "삭제가 완료되었습니다." << endl;
						*br[i] = *br[memCnt - 1];
						br[memCnt - 1]->setNum(num);
						//delete[] br[memCnt - 1];
						memCnt--;
					}
					else {
						cout << "삭제가 취소되었습니다." << endl;
						break;
					}
				}
			}
			if (cnt == 0)cout << "* 잘못된 회원번호 입니다." << endl;;
		}
		else {
			cout << "* 잘못된 회원번호 입니다." << endl;
		}
	}
}

void memBmi(Fitness **br, int &memCnt) {
	cout << "\n* 특별 관리 회원 명단\n";
	for (int i = 0;i < memCnt;i++) {
		int bmi = int(br[i]->bmi());
		if (bmi >= 25) {
			if (bmi < 30) { cout << br[i]->getNum() << "번 - " << br[i]->getName() << "님의 BMI : " << bmi << " (과체중)" << endl; }
			else if (bmi < 40) { cout << br[i]->getNum() << "번 - " << br[i]->getName() << "님의 BMI : " << bmi << " (비만)" << endl; }
			else { cout << br[i]->getNum() << "번 - " << br[i]->getName() << "님의 BMI : " << bmi << " (과도비만)" << endl; }
		}
	}
}

void myflush() {
	while (cin.get() != '\n');
}
profile
Stay hungry, stay foolish

0개의 댓글