251208 TIL - C++ 2일차
2025. 12. 8. 20:52ㆍ언리얼 7기 본캠프
오늘도 C++의 기초에 대해서 더 공부를 했음
C++에서 사용하는 기초적인 배열과 함수, void함수, 포인터의 제일 기초적인 개념과 사용법에 대해 익혔고, 저녁에 있었던 복습 세션에서도 같은 내용을 복습하며 많이 익혔음
특히 주말동안 도전x도전 과제를 진행하며 개인적으로 많은 내용을 익혔으니 그동안 작성한 코드를 같이 첨부함
void IncreaseHP_Value(Stats Stat) // 의도한대로 작동하지 않음. Stats의 복사본을 받아오기 때문에 원본에 영향이 가지 않음
{
Stat.HP += 10; // 받아온 Stat의 복사본만 +10 하기때문에 실제 HP에는 변화가 없음
}
void IncreaseHP_Ptr(Stats* Stat) // 의도한대로 작동함. Stats의 주소를 받아오기 때문에 주소를 찾아가서 안의 HP에 더하는 방식이기 때문에 원본에 영향이 감
{
(*Stat).HP += 20; // Stats의 주소를 찾아가(*Stat) Hp를 +20 하기 때문에 실제 HP에 변화가 있음
}
void IncreaseHP_Ref(Stats& Stat) // 의도한대로 작동함. Stats를 원본 참조해서 받아오기 때문에 수치를 변경하면 원본에 영향이 감
{
Stat.HP += 30; // Stats의 원본 참조한 수치에 30을 더하기 때문에 실제 HP에 변화가 있음
}
// 아침에 일어나고 수면시간을 체크합니다
// 일정 시간 이상 수면을 취하지 못했다면 컨디션 값을 낮춥니다
// 식사 유무에 따라 컨디션을 조절합니다
// 공부를 시작하고 학습량은 공부량x컨디션으로 결정합니다
// 점심시간에 컨디션이 일정 이상이면 식사를 하고 일정 이하면 낮잠을 잡니다
// 저녁시간에도 마찬가지입니다
// 이상하게 퇴근시간이 되면 갑자기 컨디션이 상승합니다
// 퇴근 후 남은 컨디션을 몽땅 소모할때까지 시간을 보냅니다
// '또 잠 적게 자겠네' 하며 잠을 잡니다
#include <iostream>
using namespace std;
int currentHour;
int condition = 100;
int study;
int learn;
bool awake, breakfast, lunch, dinner;
float wakeUpTime = 8.5f;
float sleepHour = 4.0f;
int doStudy(int condition) {
if (currentHour > 19) {
study = 2;
}
else {
study = 4;
}
return study * condition;
}
void FEVERTIME(int& condition) {
while (condition > 0) {
condition -= 1000000;
}
}
void youDie() {
cout << "당신은 죽었슴다 ㅡㅡ;" << endl;
}
void nap(int& condition) {
condition += 30;
}
void dailyCycle() {
if (wakeUpTime > 9 || condition == 0) {
youDie();
}
if (sleepHour < 4) {
condition = 30;
}
else if (sleepHour > 4 && sleepHour < 6) {
condition = 70;
}
else {
condition = 100;
}
awake = true;
if (breakfast == false) {
condition -= 30;
}
else if (breakfast == true) {
condition += 30;
}
currentHour = 9;
learn += doStudy(condition);
condition -= 30;
currentHour += 4;
if (condition < 30) {
nap(condition);
currentHour += 1;
lunch = false;
}
else {
lunch = true;
currentHour += 1;
condition += 20;
}
learn += doStudy(condition);
condition -= 30;
currentHour += 4;
if (condition < 30) {
nap(condition);
currentHour += 1;
dinner = false;
}
else {
dinner = true;
currentHour += 1;
condition += 20;
}
learn += doStudy(condition);
currentHour += 2;
condition = 9999999;
FEVERTIME(condition);
currentHour += 7;
if (currentHour > 24) {
currentHour -= 24;
}
awake = false;
sleepHour = 8.5 - currentHour;
}
#include <stack>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
// 사칙연산 함수. 나눗셈의 b의 0으로 나눔 체크는 하단에서 먼저 함
float add(float a, float b) {
float result = a + b;
return result;
}
float subtract(float a, float b) {
float result = a - b;
return result;
}
float multiply(float a, float b) {
float result = a * b;
return result;
}
float divide(float a, float b) {
float result = a / b;
return result;
}
// 연산자 우선순위 판정 함수. 곱하기에 * x X를 사용 가능하게 제작
int operPrior(char oper) {
if (oper == '+' || oper == '-') {
return 1;
}
else if (oper == '*' || oper == 'x' || oper == 'X' || oper == '/') {
return 2;
}
else {
return 0;
}
}
// 받은 입력을 후열계산식으로 변환하는 함수. 에러가 발생할 때를 대비해 isError 변수를 원본으로 같이 참조함
string infixToPostfix(string input, bool& isError) {
string result;
stack<char> operTemp; // 임시 기호 정리용 스택
for (int i = 0; i < input.length(); i++) { // 입력받은 string을 한글자씩 읽어보고 판단하는 for문
char tToken = input[i]; // 한 자씩 뗀 입력을 저장할 임시 토큰 변수 tToken
if (tToken == ' ' || tToken == '=') { // 공백 또는 = 입력. 아무것도 넣지 않고 처음부터 다시
continue;
}
if (isdigit(tToken) || tToken == '.') { // 숫자 또는 소숫점 입력
while (i < input.length() && (isdigit(input[i]) || input[i] == '.')) { // 연속되는 숫자나 소숫점을 붙여서 넣기 위해 다음 칸을 확인 후 숫자나 소숫점이면 입력
result += input[i];
i++;
}
result += " "; // 계산식에 대입하는 과정에서 stringstream으로 대입할때 숫자끼리 붙는걸 방지하기 위해 공백 추가
i--; // 대입 과정에서 i가 앞으로 갔으니 1칸 줄임
}
else if (tToken == '(') { // ( 는 즉시 스택에 입력
operTemp.push(tToken);
}
else if (tToken == '+' || tToken == '-' || tToken == '*' || tToken == 'x' || tToken == 'X' || tToken == '/') { // 연산자 입력
while (!operTemp.empty() && operPrior(operTemp.top()) >= operPrior(tToken)) { // operTemp에 내용물이 있으며, 현재 토큰에 들어있는 연산자보다 operTemp에 들어있는 연산자의 우선순위가 같거나 클 경우
result += operTemp.top(); // operTemp의 내용물을 result에 입력
result += " ";
operTemp.pop(); // 방금 입력한 내용물을 삭제
}
operTemp.push(tToken); // 토큰의 내용물(우선순위 낮은 기호)를 입력
}
else if (tToken == ')') {
while (!operTemp.empty() && operTemp.top() != '(') { // )가 입력될경우 ) 안에 있던 (를 제외한 기호들을 전부 입력시킴
result += operTemp.top();
result += " ";
operTemp.pop();
}
if (!operTemp.empty()) { // 마지막 남은 (를 삭제
operTemp.pop();
}
}
else { // 규격 외 입력 감지시
cout << "잘못된 입력이 감지되었습니다." << endl;
isError = true;
break;
}
}
while (!operTemp.empty()) { //입력을 전부 확인하고 ,기호를 담아놓은 스택이 비어있지 않을 경우 전부 비우는 while문
result += operTemp.top();
result += " ";
operTemp.pop();
}
return result; // 결과 반환
}
int main() {
float a;
float b;
float result;
string input; // 유저 입력
string convertedInput; // 후열계산식으로 변환한 입력
string token; // 토큰
char restart = 'Y'; // 재시작 입력 확인용 char
cout << "계산기를 시작합니다." << endl;
while (restart == 'Y' || restart == 'y') {
stack<float> calc; // 계산 저장용 float 스택 calc
bool isError = false; // 에러 체크용 bool
cout << "계산할 식을 입력해주세요 : ";
getline(cin, input); // 유저 인풋 string으로 받아오는 getline
convertedInput = infixToPostfix(input, isError); // infixToPostfix로 후열계산식 변환 후 convertedInput에 입력
stringstream ss(convertedInput); // convertedInput을 stringstream으로 선언
cout << "(디버그용)변환된 후열 계산식 : " << convertedInput << endl; // 디버그 라인
while (ss >> token) { // stringstream을 token에 대입하는 while문
if (isError == true) { // 진행중 isError가 true가 될 경우 즉시 반복문 탈출
break;
}
if (token != "+" && token != "-" && token != "/" && token != "*" && token != "x" && token != "X") { // token이 연산자가 아닐경우
float ftoken = stof(token); // stof로 token의 값을 float로 변환 후 임시 ftoken에 대입
calc.push(ftoken); // ftoken의 내용물을 calc에 입력
}
else { // 위 상황의 else니 token이 연산자일 경우(infixToPostfix으로 숫자와 연산자를 제외하고 전부 걸러냈으니 연산자만 남음)
if (calc.size() < 2) { // 에러 : 연산자가 나왔는데 들어있는 숫자가 하나뿐일 경우
cout << "올바르지 않은 식입니다." << endl;
isError = true; // 에러 체크 후 탈출
break;
}
char oper = token[0]; // switch문 사용을 위해 token의 0번 내용물(연산자)을 임시 변수 oper에 대입
switch (oper) { // oper의 값에 대한 switch문
// 이하 calc에서 꺼내 b에 대입, calc에서 꺼내 a에 대입, 연산자에 따라 계산 후 결과값을 calc에 입력 을 반복
case '+':
b = calc.top();
calc.pop();
a = calc .top();
calc.pop();
result = add(a, b);
calc.push(result);
break;
case '-':
b = calc.top();
calc.pop();
a = calc.top();
calc.pop();
result = subtract(a, b);
calc.push(result);
break;
case '*':
case 'X':
case 'x': // 곱하기에서는 다양한 입력을 지원
b = calc.top();
calc.pop();
a = calc.top();
calc.pop();
result = multiply(a, b);
calc.push(result);
break;
case '/':
b = calc.top();
calc.pop();
a = calc.top();
calc.pop();
if (b == 0) { // 0으로 나누기를 방지하기 위한 조치
cout << "0으로 나눌 수 없습니다!" << endl;
isError = true; // 0으로 나누기를 시도할 경우 에러 체크 후 탈출
break;
}
result = divide(a, b);
calc.push(result);
break;
}
}
}
if (isError) { // while문이 끝나고 에러가 확인될 경우 재가동 여부 확인
do { // do while문 사용
cout << "오류가 감지되었습니다. 다시 하시겠습니까? (Y/N) : ";
cin >> restart;
cin.ignore(10000, '\n'); // \n(엔터)가 나올때까지 이후 잡다한 입력 제거(char의 입력에 길다란 입력을 했을때 생기는 반복버그 방지
if (restart != 'Y' && restart != 'N' && restart != 'y' && restart != 'n') { // y n 소문자 입력 지원
cout << "재시작 값이 잘못되었습니다. 다시 입력해주세요." << endl;
}
} while (restart != 'Y' && restart != 'N' && restart != 'y' && restart != 'n'); // 유효한 입력이 나올때까지 반복
if (restart == 'n' || restart == 'N') { // n일 경우 즉시 종료
cout << "계산기를 종료합니다." << endl;
return 0;
}
continue; // y일 경우 while문 재시작 = 입력 다시 받음
}
if (calc.size() == 1) { // 연산이 모두 끝나고 여기로 왔으면 calc에는 최종 결과값만이 들어있어야 함. 체크
cout << "결과 : " << calc.top() << endl; // 마지막 남은 calc값(결과) 출력
}
else if (calc.size() > 1) { // 모종의 이유로 calc에 값이 2개 이상일 경우 에러
cout << "연산 도중 치명적인 에러가 감지되었습니다." << endl;
}
else { // 그 외의 경우
cout << "연산 결과가 없습니다." << endl;
}
do { // 재시작 체크
cout << "다시 하시겠습니까? (Y/N) : ";
cin >> restart;
cin.ignore(10000, '\n');
if (restart != 'Y' && restart != 'N' && restart != 'y' && restart != 'n') {
cout << "재시작 값이 잘못되었습니다. 다시 입력해주세요." << endl;
}
} while (restart != 'Y' && restart != 'N' && restart != 'y' && restart != 'n');
//입력 후 y일 경우 while문의 조건을 충족하니 처음부터 재시작. 아닐경우 종료
}
cout << "계산기를 종료합니다." << endl;
return 0;
}
주말에 거의 10시간을 붙잡고 만든 코드라 제대로 작동했을때 매우 뿌듯함을 느낌
이제 곧 포인터 들어갈 것 같은데 많이 어렵지는 않을지 걱정임...
'언리얼 7기 본캠프' 카테고리의 다른 글
| 251210 TIL - C++ 4일차 (1) | 2025.12.10 |
|---|---|
| 251209 TIL - C++ 3일차 (0) | 2025.12.09 |
| 251205 TIL - 챕터2 C++ 1일차 (0) | 2025.12.05 |
| 251204 TIL - 블루프린트 세션 과제 발표, C언어 세션 5일차 (0) | 2025.12.04 |
| 251203 TIL - 블루프린트 세션 5일차 + 과제, C언어 세션 4일차 (0) | 2025.12.03 |