-
✨ INTRO
C++ 의 전반적인 기본 지식을 습득하고 몇 개의 스몰 프로젝트를 진행하였다.
생각보다 자잘한 부분에서 엇 이게 뭐였더라? 싶은 부분이 많았고, 프로젝트 기간이 끝나고 (15일 ~ 21일)
한 번 다시 되짚어 보면서 ... 아직 부족한 점이 많았구나 생각이 들어 작성한다.
구현하면서 핵심적이거나 햇갈렸 던 것을 위주로 작성하겠습니다. 😎
C++ 언제쯤 내게 친숙해질 수 있는걸까...
🤦♂️ 목차 :
1. [C++] 베스킨라빈스31 게임 만들기
2. [C++] 시간 제한 30초의 끝말 잇기 (중복 금지)
3. [C++] 로또 시뮬레이션
4. [C++] 마방진 만들기
5. [C++] 임의의 세 개의 숫자 맞추기 게임, 야구 게임 (스트라이크, 볼)
1. [C++] 베스킨라빈스31 게임 만들기
사용자와 컴퓨터가 서로 번갈아가면서 숫자를 출력해야 했었던 문제.
그렇다면 차례라는 것을 어떻게 구현하면 좋을까? 생각을 오래 했다.
숫자를 입력 받고 출력하고, 그 숫자가 31에 도달해서 결과를 도출하는 것이야.
간단했지만 차례를 구현하는 아이디어를 생각하는데 오래 걸렸다.
내가 구현하는 것에 사용한 아이디어는 다음과 같다.
if (User_turn) { ...코드 구현... } else { ... 코드 구현 ... } User_trun = !User_trun;
User_turn 이라는 bool 변수를 생성하고, 그것에 따라서 유저와 사용자 간의 차례를 구분해주면 되는 것..
프로젝트를 하다 보니까 이 참과 거짓을 통한 flag 기술이 생각보다 많이 쓰였다.
아무튼 이렇게 참과 거짓을 통한 코드 통제가 생각보다 알차게 쓰여서 솔직히 재밌었음..ㅋ....
2. [C++] 시간 제한 30초의 끝말 잇기 (중복 금지)
// 앞 단어의 마지막과 입력한 단어의 첫글자가 일치하는지 확인 if (inputWord.empty() || inputWord.front() != lastWord.back()) { cout << "올바른 단어를 입력하세요!" << endl; continue; } // 단어 목록을 직접 확인하여 중복된 단어를 검사 bool isRepeated = false; for (const string& usedWord : usedWords) { if (inputWord == usedWord) { isRepeated = true; break; } }
입력한 단어와 마지막으로 저장된 단어의 끝말 잇기 규칙을 구현해낸 부분.
아이디어를 생각해내는게 오래 걸리지 막상 코드로 구현하려고 하면 몇 줄 안될 때가 많아서
굉장히 아쉬울 따름.. 빨리 빨리 생각해내고 싶다 😢
3. [C++] 로또 번호 추첨 시뮬레이션
while (!calc_Flag) { //트루값이 되면 반복문 종료. cout << "숫자를 입력하세요: "; cin >> user_input; calc_Flag = true; //만약 밑에 포문을 거쳐서 숫자가 맞다면 true 유지해서 while문 종료 for (char c : user_input) { if (!isdigit(c)) { calc_Flag = false; //요기에 왔다면 숫자가 아닌 값이라는 의미. break; } } if (!calc_Flag) { cout << i << " 번쨰 숫자에 입력한 값이 숫자가 아닙니다. 다시 입력하세요.\n" << endl; } if (calc_Flag) { //숫자라는 의미이므로, 입력한 스트링값을 int로 바꿔서 num1에 저장 num = stoi(user_input); } } i++; calc_Flag = false;
사용자가 입력한 값이 숫자가 아닌 상황인 경우 무한 루프를 돌기에 예외 상황을 놓고 싶었다.
근데, 막상 구현하려고 하니 C++ 에서 입력한 값이 숫자임을 검증하는 과정은 생각보다 번거로웠음.
입력한 값을 string으로 받아서 isdigit() 함수를 통해 정수로 이루어져 있음을 판단해야 했다.
이거 이외에는 자체적으로 제공되는 정수 판별 함수같은건 없는 듯 했다..ㅠ
정수라고 판단이 됐다면, 그걸 다시 stoi() 를 이용해서 정수로 바꿔서 저장하는 식으로 사용하였음.
i 의 경우 몇 번째 숫자가 잘못 입력됐는지 판단하기 위해서 사용하였다.
4. [C++] 마방진 만들기
// 다음 위치 계산 (우상단으로 이동) int nextRow = (row - 1 + n) % n; int nextCol = (col + 1) % n; // 다음 위치가 이미 채워져 있는 경우, 아래로 이동 if (magicSquare[nextRow][nextCol] != 0) { row = (row + 1) % n; }
위치 이동에 대한 개념이 중요했다.
직접 메모장에 적어서 확인해본 결과.
예를 들어, 2,3 에서 1,4로 이동할 땐 , 각각 -1 , +1 되는 모습을 볼 수 있었다.
따라서 다음 row col 값의 변수에 -1 +1 을 해주고,
col 값이 0이 되는 경우가 존재하기에 ( 빼기가 기본이므로 )
0이 될 때, 가장 밑인 (5,n) 으로 이동해야하므로, 기본으로 5를 더해주고 나머지 연산을 통해
0이 아닌 경우 5가 사라질 수 있도록 했다.
에초에 기본적인 마방진의 크기가 n으로 입력받고 n * n 의 크기를 유지할 것 이므로
연산에는 % 5 를 통해 마방진의 크기를 통제하는 것이 좋다.
5. [C++] 임의의 세 개의 숫자 맞추기 게임, 야구 게임 (스트라이크, 볼)
if (num < 1 || num > 9 || find(User_number.begin(), User_number.end(), num) != User_number.end()) { //입력 값이 1보다 작거나, 9보다 크거나, 중복값이 있으면 잘못됨. cout << "잘못된 입력입니다. 다시 입력하세요. 중복되었는지 혹은 범위를 초과하였는지. \n" << endl; i--; continue; } User_number.push_back(num);
find 함수를 사용해서 중복 값이 있는지 판단한다.
해당 백터의 처음과 끝(+1)까지 num 이 있는지 확인하고, num 이 있다면 num 을 반환함.
반대로 User_number.end()의 값이 반환되면 컴퓨터숫자와 일치하는게 없다는 의미. (인덱스 값 반환)
end() 의 값과 일치하지 않으니까 num 이 반환했다는 뜻이므로 같은 값이 있다는 의미.
생각보다 이 find 함수를 이해하는 데 너무 오래 걸렸다 😢
진짜 별 거 아닌거 같으면서도 하나하나 넘겨짚고 가자니 아쉽고..
내 페이스대로 천천히 가는게 맞는걸까 싶다가도 그래도 놓치는 건 아쉽기도 해서
제대로 알고 넘어가쟈...😎
🎉해당 글의 내용은 "포스코 x 코딩온 스마트 팩토리 과정 수업" 에서의 수업 자료 및 실습 과제 등에서 일부 발췌되어 작성 되었습니다.
'개발 > C++' 카테고리의 다른 글
[C++] 쓰레드(thread)의 기본 개념 학습 (1) 2023.10.06 [C++] 로또 번호 생성기 코드, 랜덤한 중복하지 않은 숫자 생성. (0) 2023.09.15 [C++] 하나의 긴 소스파일을 여러 파일로 분할하여 관리하기. (0) 2023.09.14 [C++] 오버라이딩 사용하는 이유에 대한 정리 (0) 2023.09.13 [C++] 하나의 파일을 이용하여 다른 한 개의 파일에 추가적인 입력과 수정하기 (0) 2023.09.11 댓글 (비로그인 댓글 허용하지 않습니다.)