42Seoul/CPP Module 00

ex01

재윤 2023. 12. 1. 13:05
반응형

기능 명세서

  1. 두 가지 클래스 구현
    1. PhoneBook
      1. 연락처 배열
      2. 최대 8개의 연락처 저장 가능. 9번째 연락처를 추가하려고 하면 가장 오래된 연락처를 새 연락처로
      3. 동적 할당
    2. Contact
      1. 전화번호부 연락처를 나타냄.

전화번호부 → PhoneBook 클래스의 인스턴스로 인스턴스화 되어야함.

연락처도 마찬가지, 각각은 Contact 클래스의 인스턴스로 인스턴스화 되어야함. 클래스는 자유롭게 디자인 but 클래스 내에서 사용되는 것 모든 것 비공개

main.cpp

#include "PhoneBook.hpp"

int main(void)
{
	PhoneBook phoneBook;
	std::string temp;

	while (1)
	{
		phoneBook.startUp();
		std::getline(std::cin, temp);
		if (std::cin.eof())
		{
			std::cout << "EOF meet finish" << std::endl;
			return (0); 
		}
		if (temp == "ADD")
			phoneBook.addInfo();
		else if (temp == "SEARCH")
		{
			if (phoneBook.getSize() == 0)
			{
				std::cout << "Nothing Added. Add First\\n";
				continue;
			}
			phoneBook.showInfo();
			phoneBook.showDetail();
		}
		else if (temp == "EXIT")
		{
			std::cout << "Program EXIT" << "\\n";
			return (0);
		}
	}
}

ADD

  1. ADD: 새 연락처 저장
    1. 사용자가 명령 입력 → 새 연락처 정보를 한 번에 한 필드씩 입력하는 메시지 표시. 모든 필드 완성 → 전화번호부 추가
    2. 연락처 필드 → 이름, 성, 별명, 전화번호 및 가장 어두운 비밀 → 저장된 연락처 → 빈 필드 x
void PhoneBook::addInfo()
{
	if (this->size == 8)
		setContactInfo(true);
	else if (setContactInfo(false))
	{
		this->size++;
	}
}
bool PhoneBook::Emptystring(Contact contact)
{
	if (contact.getFirstName() == "" || contact.getLastName() == "")
		return (true);
	if (contact.getNickName() == "" || contact.getPhoneNumber() == "")
		return (true);
	if (contact.getDarkestSecret() == "")
		return (true);
	return (false);
}

// 만약 배배열 8이 다 차면 제일 마지막 꺼 없애고 추가
bool PhoneBook::setContactInfo(bool isFull)
{
	std::string str;
	Contact contact;
	int index = this->size;

	std::cout << "First Name : ";
	std::getline(std::cin, str);
	contact.setFirstName(str);
	std::cout << "Last Name : ";
	std::getline(std::cin, str);
	contact.setLastName(str);
	std::cout << "Nick Name : ";
	std::getline(std::cin, str);
	contact.setNickName(str);
	std::cout << "Phone Number : ";
	std::getline(std::cin, str);
	contact.setPhoneNumber(str);
	std::cout << "Darkest Secret : ";
	std::getline(std::cin, str);
	contact.setDarkestSecret(str);
	if (!Emptystring(contact))
	{
		if (isFull)
		{
			for (int i = 1; i < this->size; i++)
			{
				this->contact[i - 1].setAllContact(this->contact[i]);
			}
			index = 7;
		}
		this->contact[index].setFirstName(contact.getFirstName());
		this->contact[index].setLastName(contact.getLastName());
		this->contact[index].setNickName(contact.getNickName());
		this->contact[index].setPhoneNumber(contact.getPhoneNumber());
		this->contact[index].setDarkestSecret(contact.getDarkestSecret());
		return true;
	}
	else
	{
		std::cout << "Empty string\\n";
		return (false);
	}
}

SEARCH

  1. SEARCH: 특정 연락처 표시
    1. 저장된 연락처를 색인, 이름, 성, 별명의 4개 열 목록으로 표시
    2. 각 열의 너비는 10자여아함, ‘|’로 구분됨 → 텍스트는 오른쪽 정렬, 텍스트가 열보다 긴 경우 텍스트를 잘라서 표시 가능한 문자를 ‘.’으로 바꿔야 한다.
    3. 그런 다음 표시할 항목의 색인을 사용자에게 다시 묻는 메시지 표시해야함. → 인덱스가 범위를 벗어나거나 잘못딘 경우 관련 동작 정의 그렇지 않으면 연락처 종보를 한줄에 하나씩 표시.
void PhoneBook::showInfo()
{

	std::cout << "============================================="
			  << "\\n";
	std::cout << "|" << std::setw(10) << "index"
			  << "|" << std::setw(10) << "first name"
			  << "|";
	std::cout << std::setw(10) << "last name"
			  << "|" << std::setw(10) << "nick name"
			  << "|"
			  << "\\n";
	std::cout << "---------------------------------------------"
			  << "\\n";
	for (int i = 0; i < this->size; i++)
	{
		std::string firstName = this->contact[i].getFirstName();
		std::string lastName = this->contact[i].getLastName();
		std::string nickName = this->contact[i].getNickName();
		if (firstName.length() > 10)
			firstName.replace(9, firstName.length() - 9, ".");
		if (lastName.length() > 10)
			lastName.replace(9, lastName.length() - 9, ".");
		if (nickName.length() > 10)
			nickName.replace(9, nickName.length() - 9, ".");
		std::cout << "|";
		std::cout << std::setw(10) << i + 1 << "|";
		std::cout << std::setw(10) << firstName << "|";
		std::cout << std::setw(10) << lastName << "|";
		std::cout << std::setw(10) << nickName << "|";
		std::cout << "\\n";
	}
	std::cout << "---------------------------------------------"
			  << "\\n";
}

EXIT

  1. EXIT : 프로그램이 종료되고 연락처가 영원히 손실
    1. 다른 입력은 모두 삭제됨. 명령이 올바르게 실행되면 프로그램은 다른 명령을 기다림.

[42SEOUL] CPP Module 00

 

[42SEOUL] CPP Module 00

Preview 저번 미니쉘을 끝으로 42서울의 과제 중 반정도를 끝냈다고 할 수 있을 것이다. 이제부터는 c++을 사용할 수 있고, norminette를 신경쓰지 않고 코딩을 할 수 있게 되었다 !! 잘가라 norminette, 어

woongtech.tistory.com

 

반응형

'42Seoul > CPP Module 00' 카테고리의 다른 글

ex00  (0) 2023.12.01