Chapter 10. 배열

Lab

배열을 이용하여 학생들의 성적을 저장하고 평균을 구해보자.

#include <stdio.h>

int main(void)

{

int grade1, grade2, grade3;

int average, i;

printf("3명의 성적을 입력하시오\n");

scanf("%d", &grade1);

scanf("%d", &grade2);

scanf("%d", &grade3);

average = grade1 + grade2 + grade3;

printf("평균 = %d\n", average);

return 0;

}

위의 프로그램을 컴파일하여 실행하고 그 결과를 기록하라.

배열을 사용하지 않고 변수의 개수를 증가시켜서 10명의 성적을 처리할 수 있도록 변경하라. 실습후 원상태로 복원하라.

위의 프로그램을 배열 grade[]를 사용하여 평균을 구하도록 변경하라. 이 때 배열의 크기는 SIZE 라는 기호 상수로 정의하여 사용하라.

(c)번 프로그램에서 10명의 성적을 처리하도록 변경하여 보라. (b)번과 비교하라.

배열의 초기화에 대하여 살펴보자.

#include <stdio.h>

#define SIZE 3

int main(void)

{

int i;

int grade[SIZE] = { 10, 20, 30 };	// ①

for(i = 0; i < SIZE; i++)

printf("%d\n", grade[i]);

return 0;

}

위의 프로그램을 컴파일하여 실행하고 그 결과를 기록하라.

배열의 크기보다 더 많은 초기화 값을 주면 어떻게 되는가? SIZE는 3으로 유지한 채 초기화 값을 10, 20, 30, 40으로 주어보라.

배열의 크기보다 더 적은 초기화 값을 주면 어떻게 되는가? SIZE는 3으로 유지한 채 초기화 값을 10, 20으로 주어보라. 초기화 되지 않은 배열 원소에는 어떤 값이 저장되어 있는가?

초기값만 주어지고 배열의 크기가 지정되지 않으면 어떻게 되는지 알기 위하여 아래와 같이 변경한 후에 컴파일, 실행하여 보라.

int grade[ ] = { 10, 20, 30 };	// 크기가 주어지지 않았음

1번 문제를 다음과 같이 함수를 이용하여 다시 작성하여 보자.

#include <stdio.h>

int cal_average(int grade[]);

int main(void)

{

int grade[] = { 10, 20, 30 };

int average;

average = cal_average(grade, 3);

printf("평균 = %d\n", average);

return 0;

}

int cal_average(int grade[], int n)

{

// ①

}

위의 프로그램에서 cal_average() 내부를 채운 후에 컴파일하여 실행하고 그 결과를 기록하라.

프로그램에서 성적을 int형이 아닌 double형으로 처리하도록 코드를 변경하여 보라.

int cal_average(int grade[3], 3)와 같이 함수를 정의할 때 매개 변수에서 배열의 크기를 정의하면 어떻게 되는가?

성적 배열과 배열의 크기를 인수로 받아서 최고 성적값을 가지는 배열 원소의 인덱스를 반환하는 함수를 작성하고 이 함수를 테스트하시오.

int get_max_index(int grade[], int n);

정수형이나 실수형 인수는 변수값이 복사되어서 함수의 매개 변수로 전달되므로 함수 안에서 매개 변수의 값을 바꾸더라도 원래의 변수의 값이 변경되지 않는다. 하지만 배열을 함수의 인수로 전달할 때는 복사되는 것이 아니라 원본이 전달된다. 따라서 매개 변수를 변경하면 원래의 배열도 변경된다.

#include <stdio.h>

#define SIZE 5

void get_grade(int s[], int n);

void print_grade(int s[], int n);

int main(void)

{

int grade[SIZE] = { 0, 0, 0, 0, 0 };

print_grade(grade, SIZE);

get_grade(grade, SIZE);

print_grade(grade, SIZE);

return 0;

}

// 사용자로부터 성적을 입력받아서 배열에 저장한다.

void get_grade(int grade[], int n)

{

// ①

}

// 배열 원소들을 화면에 출력한다.

void print_grade(int grade[], int n)

{

// ②

}

위의 프로그램에서 get_grade()와 print_grade()의 내부를 작성한 후에 실행하여 보라.

print_grade(int list[], int n)

{

}

get_grade(int list[], int n)

{

}

성적이 저장된 배열을 인수로 받아서 성적을 2배로 하는 set_double(int list[], int n) 함수를 작성하고 테스트하시오. 단 성적은 100이하로 한정된다. 함수 안에서 배열 원소의 값을 변경하면 원래의 배열 원소의 값도 변경되는가?

2개의 배열을 인수로 받아서 첫 번째 배열을 두 번째 배열로 복사하는 함수 copy_grade()를 작성하고 테스트하여 보라. 이 함수를 테스트하기 위하여 main() 함수 안에 또 하나의 배열을 선언하라.

학생들의 국어, 영어, 수학 성적을 받아서 각 과목별로 평균을 구하는 프로그램을 작성하여 보자. 여러 명의 학생들이 있고 학생마다 3과목의 성적을 저장하여야 하므로 2차원 배열을 사용하는 것이 바람직하다.

#include <stdio.h>

#define STUDENTS 5

#define SUBJECTS 3

int main(void)

{

int grade[STUDENTS][SUBJECTS];

int i, j;

for(i = 0; i < STUDENTS; i++)

for(j = 0; j < SUBJECTS; j++)

scanf("%d",&grade[i][j]);

// ①

for(i = 0; i < STUDENTS; i++)

{

for(j = 0; j < SUBJECTS; j++)

printf("%d ", grade[i][j]);

printf("\n");

}

return 0;

}

위의 프로그램을 컴파일하여 실행하고 그 결과를 기록하라.

각각의 학생별로 평균을 구하여 출력하도록 ①의 위치에 문장들을 추가하여 보라. 즉 각  학생의 평균 성적을 구하여 출력한다. 실습후 원상태로 복원한다.

각 과목별로 평균을 구하여 출력하도록 ①의 위치에 문장들을 추가하여 보라. 즉 국어, 영어, 수학 성적의 평균을 구하여 출력한다. 실습후 원상태로 복원한다.

(b)번 문제에서 평균을 구하는 부분을 하나의 함수로 독립시켜서 구현하여 보라. 즉 get_average(int list[][SUBJECT])를 구현하여서 호출하여 보라.