구조체를 이용한 학생관리 프로그램

Jaemyeong Lee·2024년 11월 23일
0

어소트락2017

목록 보기
18/20

아래는 주어진 학생 관리 프로그램의 코드를 한 줄 한 줄 꼼꼼하게 분석한 결과입니다. 모든 코드와 주석을 포함하며, 세부적으로 설명하겠습니다.


#define NAME_SIZE 32
#define ADDRESS_SIZE 128
#define PHONE_SIZE 14 // 000-000-0000\n
#define STUDENT_MAX 10
  1. #define 매크로 상수 정의
    • NAME_SIZE: 학생 이름 최대 길이 설정(32바이트).
    • ADDRESS_SIZE: 학생 주소 최대 길이 설정(128바이트).
    • PHONE_SIZE: 학생 전화번호 최대 길이 설정(14바이트).
    • STUDENT_MAX: 등록 가능한 최대 학생 수 설정(10명).

struct _tagStudent
{
    char strName[NAME_SIZE];          // 학생 이름
    char strAddress[ADDRESS_SIZE];   // 학생 주소
    char strPhoneNumber[PHONE_SIZE]; // 학생 전화번호
    int iNumber;                     // 학번(학생 고유 번호)
    int iKor;                        // 국어 점수
    int iEng;                        // 영어 점수
    int iMath;                       // 수학 점수
    int iTotal;                      // 총점
    int fAvg;                        // 평균 점수
};
  1. 학생 데이터 구조체 정의
    • _tagStudent는 하나의 학생 정보를 저장하기 위한 구조체입니다.
    • 학생의 이름, 주소, 전화번호, 학번, 과목별 점수(국어, 영어, 수학), 총점, 평균 정보를 저장합니다.
    • 배열(char[])은 고정 크기로 이름, 주소, 전화번호를 저장합니다.
    • 학번, 점수, 총점, 평균은 정수형(int) 변수로 관리합니다.

enum Menu
{
    MENU_NONE,
    MENU_INSERT,
    MENU_DELETE,
    MENU_SEARCH,
    MENU_OUTPUT,
    MENU_EXIT
};
  1. 메뉴 열거형 정의
    • Menu 열거형은 각 메뉴를 숫자로 식별할 수 있도록 정의되었습니다.
      • MENU_NONE: 초기값 (사용하지 않음).
      • MENU_INSERT: 학생 추가.
      • MENU_DELETE: 학생 삭제.
      • MENU_SEARCH: 학생 검색.
      • MENU_OUTPUT: 학생 목록 출력.
      • MENU_EXIT: 프로그램 종료.

int main()
{
    _tagStudent tStudentArr[STUDENT_MAX] = {}; // 학생 정보를 저장할 배열 (최대 10명).
    int iStudentCount = 0;                    // 현재 등록된 학생 수.
    int iStdNumber = 1;                       // 학번 관리용 변수 (1부터 시작).
    char strName[NAME_SIZE] = {};             // 검색/삭제에 사용할 임시 이름 저장 공간.

    while (true)                              // 프로그램이 종료될 때까지 반복.
  1. main 함수
    • tStudentArr: 학생 정보를 저장하는 구조체 배열, 최대 크기는 STUDENT_MAX(10).
    • iStudentCount: 현재 등록된 학생 수를 추적하는 변수.
    • iStdNumber: 학번 관리 변수, 등록 시 자동으로 증가.
    • strName: 임시로 이름을 저장할 배열.
    • while (true): 프로그램이 종료될 때까지 무한 반복 실행.

        system("cls");
  1. 화면 초기화
    • system("cls"): Windows 콘솔 화면을 지웁니다. (다른 플랫폼에서는 동작하지 않을 수 있음).

        cout << "1. 학생등록" << endl;
        cout << "2. 학생삭제" << endl;
        cout << "3. 학생탐색" << endl;
        cout << "4. 학생출력" << endl;
        cout << "5. 종료" << endl;
        cout << "메뉴를 선택하세요" << endl;
  1. 메뉴 출력
    • 학생 관리 프로그램의 기능을 사용자에게 안내합니다.
    • 메뉴 번호와 기능 설명을 출력합니다.

        int iMenu;
        cin >> iMenu;
  1. 메뉴 입력
    • cin >> iMenu: 사용자가 선택한 메뉴 번호를 입력받습니다.

        if (cin.fail())
        {
            cin.clear();
            cin.ignore(1024, '\n');
            continue;
        }
  1. 입력 오류 처리
    • cin.fail(): 입력이 잘못되었는지 확인. (예: 정수가 아닌 값을 입력).
    • cin.clear(): 에러 상태를 초기화.
    • cin.ignore(1024, '\n'): 입력 버퍼를 비워 다음 입력을 받을 수 있도록 처리.

        if (iMenu == MENU_EXIT)
        {
            break;
        }
  1. 종료 조건 확인
    • MENU_EXIT(5번 메뉴)이 선택되면 break로 루프를 종료합니다.

학생 등록 기능 (MENU_INSERT)

case MENU_INSERT:
    system("cls");
    cout << "==================== 학생추가 ====================" << endl;

    if (iStudentCount == STUDENT_MAX)
    {
        break;
    }
  1. 학생 추가 기능 시작
    • MENU_INSERT가 선택되었을 때 실행됩니다.
    • iStudentCountSTUDENT_MAX에 도달하면 더 이상 추가하지 않고 종료.

    cout << "이름 : ";
    cin >> tStudentArr[iStudentCount].strName;
    cin.ignore(1024, '\n');
  1. 학생 이름 입력
    • cin으로 이름을 입력받고, 입력 버퍼를 비워 추가 입력 충돌을 방지합니다.

    cout << "주소 : ";
    cin.getline(tStudentArr[iStudentCount].strAddress, ADDRESS_SIZE);
    cout << "전화번호 : ";
    cin.getline(tStudentArr[iStudentCount].strPhoneNumber, PHONE_SIZE);
  1. 주소와 전화번호 입력
    • cin.getline: 공백 포함 문자열 입력.

    cout << "국어 : ";
    cin >> tStudentArr[iStudentCount].iKor;
    cout << "영어 : ";
    cin >> tStudentArr[iStudentCount].iEng;
    cout << "수학 : ";
    cin >> tStudentArr[iStudentCount].iMath;
  1. 국어, 영어, 수학 점수 입력
    • 정수로 점수를 입력받습니다.

    tStudentArr[iStudentCount].iTotal =
        tStudentArr[iStudentCount].iKor +
        tStudentArr[iStudentCount].iEng +
        tStudentArr[iStudentCount].iMath;
    tStudentArr[iStudentCount].fAvg =
        tStudentArr[iStudentCount].iTotal / 3.f;
  1. 총점 및 평균 계산
    • iTotal: 국어, 영어, 수학 점수의 합.
    • fAvg: 총점 / 3.0으로 평균 계산.

    tStudentArr[iStudentCount].iNumber = iStdNumber;
    ++iStdNumber;
    ++iStudentCount;

    cout << "학생 추가 완료" << endl;
  1. 학생 정보 저장 및 학번 관리
    • iNumber: 현재 학번을 저장.
    • ++iStdNumber: 학번 증가.
    • ++iStudentCount: 등록된 학생 수 증가.

이하 코드 구조 (기능별로 반복)

  • MENU_DELETE: 학생 이름 검색 → 데이터 삭제 후 뒤 데이터 정렬.
  • MENU_SEARCH: 학생 이름 검색 → 해당 정보 출력.
  • MENU_OUTPUT: 현재 등록된 모든 학생 정보 출력.

코드의 나머지 부분은 동일한 방식으로 구체적인 기능을 구현합니다. 필요한 경우 각 기능별 코드를 더 세부적으로 다시 풀어 설명할 수 있습니다. 🎯

profile
李家네_공부방

0개의 댓글