-
[C++] 7주차. 코드 흐름도, 리뷰C++ 2024. 6. 2. 23:15
#include <iostream> #include <string> using namespace std; const int ROWS = 10; const int COLS = 6; int seats[10][6]; // 10행 6열의 좌석 배열 선언 int adultcount = 0; int childcount = 0; int changecount = 0; int totalprice = 0; // 좌석 배열 초기화 함수 // void chogihwaseats() { for (int i = 0; i < 10; ++i) { for (int j = 0; j < 6; ++j) { seats[i][j] = '0'; // 모든 좌석을 '0'으로 초기화 (빈 좌석을 의미) } } } // 현재 좌석 상태를 출력하는 함수 void displayseats() { cout << "\n1 2 3 4 5 6\n"; // 열 번호 출력 cout << "-----------\n\n"; for (int i = 0; i < ROWS; ++i) { for (int j = 0; j < COLS; ++j) { cout << seats[i][j] << " "; // 각 좌석의 상태 출력 } cout << endl; } } int main() { int choice; while (true) { // 무한 반복을 위해 while을 써서 반복 출력한다 cout << "\n**영화 예약 시스템**" << endl << endl; cout << "1. 좌석 예약" << endl; cout << "2. 예약 변경" << endl; cout << "3. 프로그램 종료" << endl; cout << "번호를 입력하세요 : "; cin >> choice; switch (choice) { case 1: displayseats(); // 현재 좌석 상태 나타내는 함수 호출 int currentadultcount, currentchildcount; cout << "\n성인(14000원) : "; cin >> currentadultcount; cout << "\n청소년(11000원) : "; cin >> currentchildcount; // 입력된 성인과 청소년 인원 수를 누적시켜주는 코드다 adultcount += currentadultcount; childcount += currentchildcount; // 성인이랑 청소년 인원 수를 총 금액에 누적 시킨다 totalprice += currentadultcount * 14000 + currentchildcount * 11000; // 성인이랑 청소년 인원 수를 더한 값만큼 좌석 예약을 반복해준다 for (int i = 0; i < currentadultcount + currentchildcount; ++i) { int col, row; cout << "\n몇열, 몇번째 좌석을 예약하시겠습니까?\n"; cin >> col >> row; // 입력 받은 좌석이 유효한지 확인한다 if (row >= 1 && row <= ROWS && col >= 1 && col <= COLS) { // 좌석이 이미 예약된 좌석인지 확인하는 코드 if (seats[row - 1][col - 1] == 0) { // 좌석 예약 성공 시 해당 좌석을 예약됨으로 표시합니다. seats[row - 1][col - 1] = 1; cout << "\n예약되었습니다." << endl; } else { cout << "\n이미 예약되었습니다. 다른 자리를 선택하세요\n"; --i; } } else { cout << "\n좌석 범위를 벗어났습니다. 다시 선택해주세요." << endl; --i; // 좌석 범위를 벗어난 경우, 다시 입력 받기 위해 인덱스를 조정합니다. } } break; case 2: displayseats(); cout << "바꿀 좌석의 갯수를 입력하세요 : "; cin >> changecount; //바꿀 좌석의 수만큼 반복하여 좌석 변경을 진행하는 코드 for (int i = 0; i < changecount; ++i) { int currentRow, currentCol, changeRow, changeCol; cout << "\n현재 좌석과 바꿀 좌석을 입력하세요"; cout << "\n현재 좌석(N열, M번째): "; cin >> currentCol >> currentRow; cout << "\n변경 좌석(n열, m번째):"; cin >> changeCol >> changeRow; if (currentRow >= 1 && currentRow <= ROWS && currentCol >= 1 && currentCol <= COLS && changeRow >= 1 && changeRow <= ROWS && changeCol >= 1 && changeCol <= COLS) { if (seats[currentRow - 1][currentCol - 1] == 1 && seats[changeRow - 1][changeCol - 1] == 0) { seats[currentRow - 1][currentCol - 1] = 0; // 현재 좌석을 취소 처리 seats[changeRow - 1][changeCol - 1] = 1; // 변경할 좌석을 예약 처리 cout << "좌석 변경이 완료되었습니다." << endl; } else { cout << "이미 예약되었습니다. 다른 자리를 선택하세요" << endl; --i; // 다시 좌석을 선택하도록 반복 인덱스를 조정 } } else { cout << "좌석 번호를 다시 입력해주세요." << endl; --i; // 좌석 범위를 벗어났을 경우 다시 입력 받기 위해 반복 인덱스를 조정 } } break; case 3: { int totalprice = adultcount * 14000 + childcount * 11000; // 예약한 인원의 총 금액을 계산 cout << "총 " << totalprice << "원 입니다." << endl; // 총 금액을 출력 return 0; // 프로그램을 종료 } break; } displayseats(); } }
2주차 과제로 만든 영화 좌석 예매 프로그램 코드이다. 이 코드를 바탕으로 흐름도를 만들어봤다.
# 코드 리뷰
지수님 코드를 보고 리뷰를 해볼 예정이다.
라면 가게 주문 프로그램 코드이다.
전체적으로 주석이 달려있지 않아 어떤 부분이 무슨 역할을 하는지 한눈에 들어오지 않는다고 느꼈다. 그래서 주석을 달면 좋을 것 같다고 생각했고 clear랑 ignore을 사용해서 입력 버퍼를 잘 처리 해주셨는데 찾아보니 INT_MAX를 사용하면 깔끔히 입력 버퍼를 지울 수 있다는 걸 나도 이번에 처음 알게 되어 이 부분도 수정을 한번 해봤다.
그리고 잘못된 번호를 입력했을 경우 조건에서 마이너스 번호를 입력 할 일은 정말 없겠지만.. ㅎㅎ 혹시나 하는 경우를 생각해 1보다 작은 조건도 추가해봤다.
nudle이라던지 함수 명이 직관적이여서 한눈에 보기 편했고 수정 전 코드도 충분히 깔끔했던 코드라고 생각한다.
# 수정 전 코드
#include <iostream> #include <typeinfo> using namespace std; int total(int* total_add, int cost) { *total_add = *total_add + cost; return *total_add; } int main() { string menu[] = { "일반 라면", "김치 라면", "치즈 라면", "떡 라면", "떡 만두 라면" }; int prices[] = { 3500, 4000, 4200, 4300, 4500 }; int total_cost = 0; while (true) { int nudle; cout << "***** 슈니의 라면 가게에 오신 것을 환영합니다. *****" << endl; for (int i = 0; i < sizeof(menu) / sizeof(string); i++) { cout << i + 1 << ". " << menu[i] << "(" << prices[i] << ")" << endl; } cout << "구매하실 라면 번호를 입력해주세요(종료는 0): "; cin >> nudle; if (cin.fail()) { cout << "숫자로 입력하세요.\n\n"; cin.clear(); cin.ignore(); continue; } if (nudle == 0) { cout << "총 가격은 " << total_cost << "원 입니다.\n"; cout << "주문을 종료합니다.\n\n"; break; } else if (nudle > 5) { cout << "제대로 된 숫자를 입력해 주세요."; continue; } string flag; string flag_array[] = { "Y", "N" }; int index = nudle - 1; cout << menu[index] << "을(를) 구매하시겠습니까?(Y/N) "; cin >> flag; auto it = find(begin(flag_array), end(flag_array), flag); if (it == end(flag_array)) { cout << "Y/N 중에 입력해주세요.\n\n"; continue; } if (flag == "N") { continue; } int count = 0; cout << "구매하실 라면 개수를 입력해 주세요 : "; cin >> count; if (cin.fail()) { cout << "숫자로 입력해주세요. 초기화면으로 돌아갑니다.\n\n"; cin.clear(); cin.ignore(); continue; } cout << menu[index] << " " << count << "개를 구매하셨습니다."; int price = prices[index] * count; cout << "가격은 " << price << "원 입니다.\n\n"; total(&total_cost, price); } }
#수정 후 코드
#include <iostream> #include <typeinfo> using namespace std; // 총 가격을 업데이트하는 함수 int total(int* total_add, int cost) { *total_add += cost; return *total_add; } int main() { string menu[] = { "일반 라면", "김치 라면", "치즈 라면", "떡 라면", "떡 만두 라면" }; int prices[] = { 3500, 4000, 4200, 4300, 4500 }; int total_cost = 0; while (true) { int nudle; // 초기 메뉴 출력 cout << "***** 슈니의 라면 가게에 오신 것을 환영합니다. *****" << endl; for (int i = 0; i < sizeof(menu) / sizeof(string); i++) { cout << i + 1 << ". " << menu[i] << " (" << prices[i] << "원)" << endl; } cout << "구매하실 라면 번호를 입력해주세요(종료는 0): "; cin >> nudle; // 입력이 숫자가 아닌 경우 처리 if (cin.fail()) { cout << "숫자로 입력하세요.\n\n"; cin.clear(); cin.ignore(INT_MAX, '\n'); // 입력 버퍼를 깔끔히 지워주기 continue; } // 종료 if (nudle == 0) { cout << "총 가격은 " << total_cost << "원 입니다.\n"; cout << "주문을 종료합니다.\n\n"; break; } // 잘못된 번호 입력했을 경우 else if (nudle < 1 || nudle > 5) { cout << "올바른 숫자를 입력해 주세요.\n\n"; continue; } string flag; string flag_array[] = { "Y", "N" }; int index = nudle - 1; cout << menu[index] << "을(를) 구매하시겠습니까?(Y/N): "; cin >> flag; // Y/N 확인 if (find(begin(flag_array), end(flag_array), flag) == end(flag_array)) { cout << "Y/N 중에 입력해주세요.\n\n"; continue; } if (flag == "N") { continue; } int count = 0; cout << "구매하실 라면 개수를 입력해 주세요: "; cin >> count; // 입력이 숫자가 아닌 경우 처리 if (cin.fail()) { cout << "숫자로 입력해주세요. 초기화면으로 돌아갑니다.\n\n"; cin.clear(); cin.ignore(INT_MAX, '\n'); continue; } // 총 가격 및 개수 출력 cout << menu[index] << " " << count << "개를 구매하셨습니다.\n"; int price = prices[index] * count; cout << "가격은 " << price << "원 입니다.\n\n"; // 총 가격 업데이트 total(&total_cost, price); } }
# 계산기 프로그램 코드 리뷰
#include <iostream> #include <cmath> using namespace std; int main() { while (true) { double a, b, r; int c; cout << "=============================\n 공학용 계산기 프로그램\n=============================\n사용할 기능을 선택하세요:\n1. 더하기\n2. 빼기\n3. 곱하기\n4. 나누기\n5. 거듭제곱\n6. 제곱근\n7. 사인\n8. 코사인\n9. 탄젠트\n"; cin >> c; if (c == 1 || c == 2 || c == 3 || c == 4 || c == 5) { cout << "첫 번째 숫자 입력: "; cin >> a; cout << "두 번째 숫자 입력: "; cin >> b; } else if (c == 6 || c == 7 || c == 8 || c == 9) { cout << "숫자 입력: "; cin >> a; } switch (c) { case 1: r = a + b; break; case 2: r = a - b; break; case 3: r = a * b; break; case 4: if (b == 0) { cout << "0으로 나눌 수 없습니다.\n"; continue; } r = a / b; break; case 5: r = pow(a, b); break; case 6: if (a < 0) { cout << "음수의 제곱근은 계산할 수 없습니다.\n"; continue; } r = sqrt(a); break; case 7: r = sin(a); break; case 8: r = cos(a); break; case 9: r = tan(a); break; default: cout << "유효하지 않은 선택입니다.\n"; continue; } cout << "-----------------------------\n 결과: " << r << endl << "-----------------------------\n"; char cont; cout << "계속 하시겠습니까? (y/n): "; cin >> cont; if (cont == 'n' || cont == 'N') break; cout << "=============================\n\n"; } return 0; }
제공된 코드를 보면 우선 if문 조건이 경우의 수 하나씩 입력해서 길어진 모습을 볼 수 있었다. 그리고 전체적으로 대괄호 하고 문단이 안나눠져 있어서 가로로 코드가 길쭉해져서 한눈에 들어오는 코드는 아니라고 생각이 들었다. 그리고 주석도 없어서 구분을 해주기 위해 주석도 추가하면 좋을 것 같았다.
우선 if문 조건을 && 연산자를 사용해서 1이랑 같거나 크고 5랑 같거나 작은 숫자를 받는 조건으로 설정하고 밑에도 똑같은 방식으로 해줬다. 그리고 문단도 나눠줘서 길이가 훨씬 줄어들어 한눈에 보기 편해졌다.
그리고 case를 보고 나는 한줄로 있는게 더 보기 편한거 같은데 사람마다 다를 수 있기 때문에 그대로 놔두었다.
주석을 달고 if문 조건 고치기만 해줬다.
#수정 후 코드
#include <iostream> #include <cmath> using namespace std; int main() { while (true) { double a, b, r; int c; // 기능 출력 cout << "=============================\n공학용 계산기 프로그램\n=============================\n"; cout << "사용할 기능을 선택하세요 : \n1.더하기\n2.빼기\n3.곱하기\n4.나누기\n5.거듭제곱\n6.제곱근\n7.사인\n8.코사인\n9.탄젠트\n"; cin >> c; // 기능 입력 받기 if (c >= 1 && c <= 5) { cout << "첫 번째 숫자 입력: "; cin >> a; cout << "두 번째 숫자 입력: "; cin >> b; } else if (c >= 6 && c <= 9) { cout << "숫자 입력: "; cin >> a; } // 입력 받은 연산 기능 수행 switch (c) { case 1: r = a + b; break; case 2: r = a - b; break; case 3: r = a * b; break; case 4: if (b == 0) { cout << "0으로 나눌 수 없습니다.\n"; continue; } r = a / b; break; case 5: r = pow(a, b); break; case 6: if (a < 0) { cout << "음수의 제곱근은 계산할 수 없습니다.\n"; continue; } r = sqrt(a); break; case 7: r = sin(a); break; case 8: r = cos(a); break; case 9: r = tan(a); break; default: cout << "유효하지 않은 선택입니다.\n"; continue; } // 결과 출력 cout << "-----------------------------\n 결과: " << r << endl << "-----------------------------\n"; char cont; cout << "계속 하시겠습니까? (y/n): "; cin >> cont; if (cont == 'n' || cont == 'N') break; else if (cont == ) } return 0; }
'C++' 카테고리의 다른 글
[C++] 6주차. 복사 생성자, 템플릿, STL 구현 (0) 2024.05.20 [C++] 회원 정보 관리 프로그램 (0) 2024.05.14 [C++] 5주차. 객체 포인터, 배열 / 동적 할당 / 벡터 (0) 2024.05.13 [C++] 원 계산기 프로그램 실습 (0) 2024.04.30 [C++] 4주차. 객체, 클래스, 생성자, 소멸자 문서화 (0) 2024.04.29