[정답] 50. 인덱스 연산자

◈ 기본 연습
1. 4 명의 국어 성적을 관리할 수 있는 배열을 선언하시오.
그리고 첫번째 학생은 90점, 두번째 학생은 85, 세번째 학생은 69, 네번째 학생은 75점으로 대입합니다.
네 명의 국어 성적의 합계, 평균을 출력하는 프로그램을 작성하시오
답:

//4 명의 국어 성적을 관리할 수 있는 배열을 선언하시오.
//그리고 첫번째 학생은 90점, 두번째 학생은 85, 세번째 학생은 69, 네번째 학생은 75점으로 대입
//네 명의 국어 성적의 합계, 평균을 출력하는 프로그램을 작성하시오
 
 
#include <stdio.h>
#define MAX_STUDENT 4
 
int main(void)
{
    int scores[MAX_STUDENT];    
    int ni;
    int sum=0;
    
    scores[0] = 90;
    scores[1] = 85;
    scores[2] = 69;
    scores[3] = 75;
 
    for (ni = 0; ni < MAX_STUDENT; ni++)
    {
        sum += scores[ni];        
    }
    printf("합계: %d , 평균: %.2f\n", sum, sum / (double)MAX_STUDENT);
    return 0;
}

▷실행 결과

합계: 319 평균: 79.75

2. 한 명의 국어, 영어, 수학 성적을 관리하는 프로그램을 작성하시오.

a. 국어, 영어, 수학 성적은 초기값을 -1로 설정합니다.
b. 프로그램은 다음을 반복합니다.
b.1 “I: 추가 D: 삭제 S:검색 L:전체 출력 E:종료”를 화면에 출력
b.2 하나의 문자를 입력받음
b.3 입력받은 문자가 ‘i’ 혹은 ‘I’일 때는 추가, ‘d’ 혹은 ‘D’일 때는 삭제 , ‘s’ 혹은 ‘S’일
때는 검색,
‘l’, ‘L’일 때는 전체 출력을 수행합니다.
* 추가 기능에서는 과목을 선택한 후에 성적을 입력받아 해당 과목의 성적을 설정합니다.
*삭제 기능에서는 과목을 선택한 후에 선택한 과목의 성적을 -1로 설정합니다.
*검색 기능에서는 과목을 선택한 후에 선택한 과목의 성적을 출력합니다.
*전체 출력에서는 모든 과목의 성적을 출력합니다.
(단, E를 누르면 프로그램을 종료)
답:

//한 명의 국어, 영어, 수학 성적을 관리하는 프로그램을 작성하시오.
//a.국어, 영어, 수학 성적은 초기값을 - 1로 설정합니다.
//b.프로그램은 다음을 반복합니다.
//b.1 “I: 추가 D : 삭제 S : 검색 L : 전체 출력 E : 종료”를 화면에 출력
//b.2 하나의 문자를 입력받음
//b.3 입력받은 문자가 ‘i’ 혹은 ‘I’일 때는 추가, ‘d’ 혹은 ‘D’일 때는 삭제, ‘s’ 혹은 ‘S’일
//때는 검색,
//‘l’, ‘L’일 때는 전체 출력을 수행합니다.
//* 추가 기능에서는 과목을 선택한 후에 성적을 입력받아 해당 과목의 성적을 설정합니다.
//*삭제 기능에서는 과목을 선택한 후에 선택한 과목의 성적을 - 1로 설정합니다.
//*검색 기능에서는 과목을 선택한 후에 선택한 과목의 성적을 출력합니다.
//*전체 출력에서는 모든 과목의 성적을 출력합니다.
//(단, E를 누르면 프로그램을 종료) 
#include <stdio.h>
enum SubjectType
{
    KOREAN, ENGLISH, MATH, MAX_SUBJECT
};
 
int main(void)
{
    int scores[MAX_SUBJECT] = { -1,-1,-1 };
    const char *titles[MAX_SUBJECT] = { "국어","영어","수학" };
    char key = '\0';
    int si, s;
    while (key != 'E')
    {
        printf("I:추가 D:삭제 S:검색 L:전체 출력 E:종료\n");
        printf("메뉴 선택:");
        scanf_s(" %c", &key, 1); //엔터를 스킵하기 위해 앞에 공백을 포함
        switch (key)
        {
        case 'i': case 'I':
            for (si = 0; si < MAX_SUBJECT; si++)
            {
                printf("%s:%d ", titles[si], si + 1);
            }
            printf("과목 입력:");
            scanf_s("%d", &s);
            if ((s <= 0) || (s>MAX_SUBJECT))
            {
                printf("잘못 선택하셨네요.");
            }
            else
            {
                printf("성적 입력:");
                scanf_s("%d", scores + s - 1);
                if ((scores[s - 1] < 0) || (scores[s - 1]>100))
                {
                    scores[s - 1] = -1;
                }
            }
            break;
        case 'd': case 'D':
            for (si = 0; si < MAX_SUBJECT; si++)
            {
                printf("%s:%d ", titles[si], si + 1);
            }
            printf("과목 입력:");
            scanf_s("%d", &s);
            if ((s <= 0) || (s>MAX_SUBJECT))
            {
                printf("잘못 선택하셨네요.");
            }
            else
            {
                scores[s - 1] = -1;
            }
            break;
        case 's': case 'S': 
            for (si = 0; si < MAX_SUBJECT; si++)
            {
                printf("%s:%d ", titles[si], si + 1);
            }
            printf("과목 입력:");
            scanf_s("%d", &s);
            if ((s <= 0) || (s>MAX_SUBJECT))
            {
                printf("잘못 선택하셨네요.");
            }
            else
            {
                printf("%d\n",scores[s - 1]);
            }
            break;
        case 'l': case 'L': 
            for (si = 0; si < MAX_SUBJECT; si++)
            {
                if (scores[si] != -1)
                {
                    printf("%s과목 성적:%d\n", titles[si], scores[si]);
                }
                else
                {
                    printf("%s과목 성적:입력하지 않았음\n", titles[si]);
                }
            }
            break;
        case 'E': break;
        default: printf("잘못 선택하셨네요.\n");  break;
        }
 
    }
    return 0;
}

코드를 보시면 같은 작업을 계속 작성하는 부분을 알 수 있습니다.
이처럼 같은 코드를 중복하는 것은 유지 보수 비용을 많이 들게 합니다.
이러한 부분들은 함수를 사용하여 구조적으로 프로그래밍하여 개선할 수 있습니다.

3.10 개의 정수를 입력받아 크기 순으로 정렬하시오.
답:

//10 개의 정수를 입력받아 크기 순으로 정렬
#include <stdio.h>
int main(void)
{
    int arr[10];
    int i,j;
    
    
    printf("10개의 정수를 입력하세요.\n");
    //입력
    for (i = 0; i < 10; i++)
    {
        printf("%d 번째:",i+1);
        scanf_s("%d", arr + i);
    }
 
    //순차 정렬
    for (i = 0; i < 10; i++)
    {
        for (j = i; j < 10; j++)
        {
            if (arr[i] > arr[j])//arr[i]가 arr[j]보다 크면
            {
                //두 수 교환
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
    
    //출력
    for (i = 0; i < 10; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}