42 Seoul

[42Seoul] CPP00

jaewpark 2022. 6. 13. 16:58

General rules ▼

더보기
General rules
플래그 -Wall -Wextra -Werror -std=c++98
클래스 이름을 UpperCamelCase 형식으로 작성 (ClassName.tpp 와 같은...)
사용 금지 : *printf(), *free 및 free()
메모리 누수 방지
STL in Module 08 을 사용
(no Containers (vector/list/map/and so forth) and no Algorithms (anything that requires to include the header))


ex00 하면서 사용된 것이지만, 미리 숙지 하면 좋을 것
Naming Convention in C++

 


Exercise 00 : Megaphone

C 같이 만들었다가 juhur의 조언대로 CPP 스러운 코드로 변경을 하였다.

std::stringtoupper

std::string
타입의 변수를 지정하거나 값을 지정 혹은 값을 할당할 수 있다.

#include <string>

std::string cadetId;

std::string cadetId("jaewpark");

cadetId = "jaewoopark"

toupper
주어진 문자를 대문자로 변환, 반환값은 int

  • 알파벳의 경우 - 대문자 버전의 ASCII 코드채널
  • 알파벳이 아닌 경우 - ASCII 코드채널

 

std::coutstd::endl

std::endl 보다는 << '\n' 속도 면에서 더 빠르다

 

그리고 사용했던 push_back 허용된 버전보다 상위 버전이라서 사용을 하면 안됨... 사용할 때, 언제 나온 건지 레퍼런스를 참고해야 한다

정확히는 버전 20에서 변경된 부분이 있어, 기존에 쓰였던 것과 동일하게 사용하면 됨(c++98 push_back)


Exercise 01 My Awesome PhoneBook

  • 프로그램 시작할 때 전화번호부는 비어있고 사용자는 세 가지 명령 중 하나를 입력하라는 메시지를 받는다. ADD, SEARCH 그리고 EXIT
  • 전화번호부와 연락처에 대한 클래스를 구현
  • 전화번호부 및 연락터는 클래스의 인스턴스로 인스턴스화
  • 제공된 입력이 아닌 다른 입력은 삭제

 

PhoneBook

  • 연락처에 대한 배열이 존재
  • 최대 8개까지 저장 가능
  • 9번째 연락처가 추가될 시 가장 오래된 연락처를 새 연락처와 변경
  • 동적 할당 금지

 

Contact

  • 전화번호부 연락처

 

Add : 새 연락처 저장

  • 사용자가 명령 입력 시, 연락처의 정보를 한 번에 한 필드씩 입력하도록 메시지 출력
  • 모든 필드 입력 받았을 시, 전화번호부에 추가 (필드가 공백 불가)
  • 연락처의 필드는 first name, last name, nickname, phone number 그리고 darkest secret

 

Search : 특정 연락처 표시

  • 저장된 연락처를 index, first name, last name 그리고 nickname으로 4개의 열 이루어진  목록 출력
    각 열의 너비는 10자,
  • 파이프 문자로 구분
  • 오른쪽 정렬
  • 텍스트가 10자를 넘어서면 "."으로 대체
  • 출력된 후, 다시 입력하라는 메시지 표시
  • index를 벗어나거나 잘못된 경우 관련 동작을 정의
  • 그렇지 않은 경우 한줄에 하나의 필드씩 연락처 정보를 표시

 

Exit

  • 프로그램이 종료
  • 저장된 연락처 삭제

 

std::setw 그리고 std::setfill

출력 작업에 사용할 필드의 너비를 설정 그리고 설정된 너비를 어떠한 문자로 채울 지 정하는 함수

 

클래스에서 사용한 생성자소멸자

 

생성자

  • 객체의 생성과 동시에 멤버 변수를 초기화해주는 생성자(constructor)라는 멤버 함수를 제공하며, 클래스 생성자(constructor)의 이름은 해당 클래스의 이름과 같습니다.
  • 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있습니다.
  • 생성자는 반환값이 없지만, void형으로 선언하지 않습니다.
  • 객체를 초기화하는 방법이 여러 개 존재할 경우에는 오버로딩 규칙에 따라 여러 개의 생성자를 가질 수 있습니다.

소멸자

  • 생성자의 반대 역할로 사용이 끝난 객체를 정리
  • 소멸자는 인수를 가지지 않습니다.
  • 소멸자는 반환값이 없지만 void형으로 선언하지 않습니다.
  • 객체는 여러 개의 생성자를 가질 수 있지만, 소멸자는 단 하나만 가질 수 있습니다.
  • 소멸자는 const, volatile 또는 static으로 선언될 수는 없지만, const, volatile 또는 static으로 선언된 객체의 소멸을 위해서 호출될 수는 있습니다.

클래스의 생성자/소멸자 선언

Book::Book() {
  title = "";
  total_page = "";
}

Book::~Book() { }

 

string 을 char *로

string str = "It's rainning";
const char* str2 = str.c_str();

char *를 int 로

char* str = "20220616";
int date = atoi(str);

 

string에서 char * 그리고 int

string yearYear = "20022022";
int num = atoi(yearYear.c_str());

 

string 라이브러리의 getline()

  • 최대 문자 수를 입력하지 않아도 되며, 원하는 구분자를 만날 때까지 모든 문자열을 입력받아 하나의 string 객체에 저장
getline(istream& is, string& str, char delim);
getline(istream& is, string& str);

// 사용
std::string name;
std::getline(std::cin, name);