c 9. 배열
c 9. 배열
1. 배열의 개요
- 배열(array)의 개념
같은 종류의 자료형을 선언하기 위해 구성된 데이터의 집합
서로 연관된 데이터를 변수에 별도로 표현하지 않고 하나의 묶음으로 표현
-> 소스코드를 쉽게 관리할 수 있음
- 배열을 사용하는 이유
처리해야 할 데이터가 많은 경우 변수를 일일이 선언해서 하기 보다는 많은 데이터를 저장할 수 있는 메모리 공간과 데이터를 손쉽게 처리할 방법이 필요 -> 배열 사용
변수의 메모리 주소는 무작위이지만 배열은 할당된 크기만큼 연속된 메모리를 할당 받아 index를 이용해서 옮겨 다닐 수 있다.
- 배열에서 데이터 접근
배열은 인덱스와 같은 번호에 대응하는 데이터로 이루어진 자료구조
전체 그룹에 대한 이름을 부여하고 0부터 시작하는 숫자로 구성된 인덱스로 데이터에 접근
2. 배열의 선언과 초기화
- 배열의 선언
배열을 사용하기 위해선 연속된 메모리 저장공간 필요
배열 선언에 필요한 4가지 요소 : 배열의 자료형, 배열의 이름, 배열의 크기, 배열의 요소
* 배열의 자료형
배열의 구성 요소에 따라 결정
변수의 자료형과 비슷함
정수형 : int, long
실수형 : float, double
문자형 : char
* 배열의 이름
배열에는 각각의 배열 요소를 대표할 이름이 필요함
배열의 이름은 해당 배열의 대표 이름이면서 동시에 메모리에 연속해서 배치된 배열의 시작 주소 의미
변수 이름과 마찬가지로 배열의 이름에도 예약어를 사용할 수 없음
* 배열의 크기
배열의 요소의 개수를 지정해 줘야함 (필수는 아님)
배열의 크기에는 정수값만 허용
변수 이름이나 음의 정수, 실수값 등을 지정하면 에러 발생
int a[b]; // 변수의 이름으로 선언해서 에러
int c[-3]; // 음의 정수값으로 선언해서 에러
int d[0]; // 0으로 선언해서 에러
int e[3.5]; // 실수값으로 선언해서 에러
배열의 크기는 한 번 선언하면 변할 수 없기 때문에 값이 변할 수 있는 정수는 사용할 수 없고 정수형 상수나 '#define'으로 선언한 상수만 사용할 수 있음
#define a 3;
int b[a];
배열의 크기를 지정하지 않으면 배열 요소의 개수만큼 크기가 자동으로 설정됨
int a[3] = { 1, 2, 3 };
int b[] = { 1, 2, 3 };
// a와 b의 크기는 같음
배열의 크기는 배열의 요소의 개수와 일치하도록 선언해야 함
배열의 요소보다 많게 배열의 크기를 선언하면 남는 배열의 크기에 0 이 자동으로 채워지고 작게 선언하면 에러 발생
* 배열의 요소(array element)
배열을 구성하는 각각의 요소
배열의 크기만큼 배열의 요소로 초기화
중괄호 ({ }) 안에 요소들을 콤마(,) 로 구분해서 선언
배열의 크기보다 적게 선언하면 빈 인덱스는 자동으로 0으로 채워지고 많게 선언하면 에러 발생
- 배열의 초기화
배열을 초기화 & 특정 인덱스만 초기화
* 배열을 초기화
배열도 변수의 일종이기 때문에 선언과 동시에 초기화할 수 있음
(자료형) (배열이름)[(배열크기)] = {(배열요소)};
int a[3] = {1, 2, 3};
*배열을 초기화하는 두 가지 방법
(1) 중괄호({ }) 안에 각 배열의 요소의 초깃값을 콤마로 구분하여 한꺼번에 지정
(2) 배열 요소의 인덱스에 해당하는 값을 각각 대입하여 초기화
int a[3] = { 1, 2, 3 }; // (1)
int b[3]; // (2)
b[0] = 1;
b[1] = 2;
b[2] = 3;
* 배열의 특정 인덱스만 초기화
배열을 선언한 수 특정 인덱스만 초기화
나머지 인덱스는 모두 0으로 자동으로 초기화됨
int a[3];
a[1] = 3;
// a = {0, 3, 0}
* 배열 사용 시 주의 사항
3. 배열의 활용
- 배열과 반복문
배열은 반복문을 위해서 탄생한 것이라고 봐도 과언이 아님
반복문에서는 배열의 각 인덱스에 간편하게 접근할 수 있음
* 예시 - for 문을 사용해 배열 초기화
int a[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
->
int a[3];
for (int i=0;i<3;i++)
a[i] = i+1
인덱스는 0부터 시작하기 때문에 배열의 크기에서 -1 을 한 값 까지 반복해야 함
* for 문으로 배열의 요소를 차례대로 출력
#include <stdio.h>
int main(void) {
int score[5] = {87, 78, 94, 83, 98};
for (int i = 0; i < 5; i++) {
printf("score[%d] : %d\n\n", i, score[i]);
}
}
* 배열을 사용해서 3개 과목의 총점과 평균 출력
#include <stdio.h>
#define DT 3
int main(void) {
int score[DT];
int sum = 0;
float avg = 0;
for (int i = 0; i < 3; i++) {
printf("과목%d 점수 : ", i + 1);
scanf_s("%d", &score[i]);
}
// 합계 계산
for (int i = 0; i < 3; i++) {
sum += score[i];
}
// 평균 계산
avg = (float)sum / DT;
printf("총점 : %d\n", sum);
printf("평균 점수 : %.2f\n", avg);
}
* 배열 요소의 값을 랜덤하게 출력
#include <stdio.h>
#include <stdlib.h> // rand()
#include <time.h> // time()
#define PT 7 // 배열의 크기
int main(void) {
int ex[PT];
printf("1~300 사이의 숫자를 랜덤 출력\n");
srand((unsigned)time(NULL)); // 시간 차별화
for (int i = 0; i < PT; i++) {
ex[i] = 1 + (rand() % 300); //1~300 사이의 난수
}
for (int i = 0; i < PT; i++) { //배열을 순차적으로 출력
printf("ex[%d] : %d\n", i, ex[i]);
}
}
(rand() 함수 사용 방법은 'c 7. 함수' 에 나와있음)
- 배열 요소의 개수 구하기
'sizeof()' 함수 사용
'배열 요소 개수' = sizeof(배열이름) / sizeof(배열이름[0])
'sizeof()' 함수는 ()의 값의 메모리 크기를 반환하기 때문에 전체 배열의 메모리 크기를 한 요소의 메모리 크기로 나누면 배열의 요소의 개수를 구할 수 있음
* 예시 - 배열의 요소 개수를 파악해서 출력
#include <stdio.h>
int main(void) {
int point[] = {23, 55, 76, 87, 34, 96};
int size;
printf("point[] = {23, 55, 76, 87, 34, 96}\n");
// 배열의 요소 개수 구하기
size = sizeof(point) / sizeof(point[0]);
printf("point[] 배열 요소의 개수 : %d개\n", size);
return 0;
}
* 예시 - 배열을 사용해서 자동차를 예약 관리하는 프로그램 만들기
중복된 예약을 할 수 없도록 하기
#include <stdio.h>
# define CP 10
int main(void) {
char yn; //시작과 종류 문자 변수
int choice; // 모델 번호
int car[10] = { 0 }; // 배열의 요소를 모두 0으로 초기화
do
{
printf("자동차 모델을 선택하시겠습니까 ? : (Y or N)\n");
scanf_s(" %c", &yn); // 형식 지정자 앞에 공백을 한 칸 줘서 엔터키 값 지워줌
if (yn == 'n' || yn == 'N') {
break;;
}
else {
printf("\n자동차 모델 번호 : 1 2 3 4 5 6 7 8 9 10\n");
printf("자동차 예약 현황 : ");
for (int i = 0; i < CP; i++) {
printf("%d ", car[i]);
}
printf("\n");
re_input:
printf("\n자동차 모델 선택 (1~10) : ");
scanf_s(" %d", &choice);
if (choice < 11 && choice > 0) {
if (car[choice - 1] == 0) {
car[choice - 1] = 1; // 예약
printf("\n예약 완료\n");
}
else {
printf("[No.%d]모델은 이미 예약 되었습니다\n", choice);
goto re_input;
}
}
else {
printf("잘못된 값을 입력했습니다. 다시 입력하시오\n\n");
goto re_input;
}
}
} while (1);
}
* 무한 반복문에서 scanf_s() 함수를 사용할 경우 getchars() 함수를 사용해서 엔터키 값을 지워줘야 한다. 지워주지 않으면 엔터키 값이 적용되어 프로그램이 정상적으로 실행되지 않는다.
또 다른 방법으로는 scanf_s() 함수에서 형식 지정자 앞에 공백을 주면 ( ex - " %c") 마찬가지로 값을 입력할 때마다 엔터키 값을 메모리에서 지워준다.
- 배열과 문자열
C언어에는 문자열을 처리하는 자료형이 따로 없기때문에 문자형 배열을 선언해 문자열을 표현
* 문자와 문자열 초기화
문자 : 작은 따옴표(' ') 로 묶어줌. 아스키코드값 1바이트 크기.
문자열 : 큰 따옴표(" ") 로 묶어줌. 문자가 한 글자여도 큰따옴표로 묶으면 문자열로 인식. 아스키코드값 + NULL 값 크기.
* 배열 선언과 문자열 초기화
배열로 문자열을 처리할 때는 반드시 문자열+1 로 크기를 선언해야 함
문자열 마지막에 NULL 문자가 저장되기 때문
char a[6] = "hello";
// 문자 5개로 이루어 졌지만 NULL 값 포함해서 크기를 6으로 선언
배열 자체에 문자열을 저장하는 표현은 C언어에서는 사용하지 않음
char a[6];
char a = "hello";
// 컴파일 에러
* 문자열 배열의 크기 설정
배열의 크기를 문자열 크기 + 1 보다 크게 선언하면 필요없는 메모리를 낭비하게 됨
배열의 크기를 문자열 크기보다 작게 선언하면 컴파일 에러 발생
항상 배열의 크기를 문자열 크기 + 1 로 선언해야함
* 예시 - 배열의 크기를 문자열 크기만큼만 했을때와 문자열 크기 + 1 만큼 했을 때
#include <stdio.h>
int main(void) {
char str1[6] = "apple";
char str2[5] = "apple";
printf("배열 크기 6 : %s\n", str1);
printf("배열 크기 5 : %s\n", str2);
}
배열의 크기를 문자열의 크기 만큼만 하면 문자열의 끝을 알리는 NULL 문자가 들어가지 않아서 문자열이 비정상적으로 출력됨
반그시 문장려의 끝을 알리는 NULL 문자가 들어갈 메모리 공간을 확보해줘야 함
* 예시 - 입력한 문자열의 길이 구하기
#include <stdio.h>
int main(void) {
char str[20];
int length = 0;
printf("20자 이내의 문자열을 입력하시오 : ");
scanf_s("%s", str, sizeof(str));
for (int i = 0; str[i] != '\0'; i++) {
length++;
}
printf("\n입력한 문자열의 길이 : %d\n", length);
}
'scanf_s()' 함수에서 %s 로 문자열을 입력받을 때에는 배열 그 자체가 메모리 주소와 같은 역할을 수행하기 때문에 '&'를 생략할 수 있다.
- 배열과 함수
함수에서도 배열 사용 가능
함수를 호출하는 쪽은 인수를 전달하고 호출되는 쪽은 매개변수를 선언해서 인수와 일대일 대응 관계로 값을 받음
배열은 선언하는 것 자체가 주소를 활용하는 것이기 때문에 배열을 사용하여 함수를 호출할 때에는 배열의 주소를 인수로 넘김
* 예시 - 배열로 5개 과목의 점수를 선언해서 사용자정의 함수를 통해 총점과 평균을 구하는 코드
#include <stdio.h>
#define DT 5 // 과목 개수
int add(int score[], int size); // 사용자 정의 함수 선언
int main(void) {
int score[5] = { 87, 95, 100, 83, 98 }; // 5개 과목 점수
int sum = 0;
float avg;
sum = add(score, DT); // 사용자 정의 함수 호출 (베열을 인수로 전달)
avg = (float)sum / DT;
printf("총점 : %d\n", sum);
printf("평군 : %.2f\n", avg);
return 0;
}
int add(int score[], int size) { // 사용자 정의 함수 정의
int total = 0;
printf("사용자 정의 함수로 총점 계산\n");
for (int i = 0; i < size; i++) {
total += score[i];
}
return total;
}
add() 함수를 호출해서 score 배열이름과 기호 상수 DT를 인수로 전달하고 add() 함수에서는 매개변수를 score[], size 로 선언
* 배열 원본 유지하기
호출되는 함수 안에서 배열 요소의 값을 변경할 수 있음
배열로 함수를 호출할 때 원본 배열의 요소의 값을 유지하려면 매개변수의 배열명 앞에 'const' 키워드 선언
* 예시 - 'const' 키워드로 선언된 매개변수의 배열을 수정하려고 하는 경우
void func(const int array[]){
array[0] = 0; // 컴파일 오류 발생
}
* 배열 요소를 인수로 전달
배열 자체가 아닌 배열 요소를 인수로 전달할 수도 있음
배열 요소를 인수로 전달하면 복사된 배열 요소가 전달되기 때문에 원본 배열에는 아무런 영향을 미치지 않음
* 예시 - 제곱값을 반환하는 함수의 배열의 요소를 전달했을 때 원본 배열을 확인하는 코드
#include <stdio.h>
int gob(int a);// 사용자 정의 함수 선언
int main(void) {
int a[5] = { 1, 2, 3, 4, 5 };
int result = gob(a[2]); // 사용자 정의 함수에 배열의 요소를 인수로 전달해서 호출
printf("gob(a[3]) 의 결과 : %d\n", result);
printf("함수 실행 후 a[3]의 값 : %d\n", a[2]);
return 0;
}
int gob(int a) { // 인수의 제곱값을 반환하는 사용자 정의 함수
int pow = a * a;
return pow;
}
함수에 배열의 요소를 인수로 전달해도 원본 배열에는 영향을 끼치지 않음
4. 배열을 활용한 정렬과 탐색
- 선택 정렬
정렬되지 않은 배열 요소의 데이터 값에서 가장 작은 값을 찾아 맨 앞의 데이터와 교환해 가면서 정렬하는 방식
맨 앞의 요소 부터 자신을 제외한 가장 작은 수와 위치를 바꿈
* 예시 - 선택정렬 코드
#include <stdio.h>
int main(void) {
int s_list [5] = {5, 3, 2, 4, 1};
int a, b, temp, sort;
printf("초기 > 배열 요소 : 5 3 2 4 1\n");
printf("\n[for 문으로 선택 정렬 수행]\n");
for (a = 0; a < 4; a++){ // 자신과 비교할 인덱스 제외(5 - 1)
sort = a; // 배열 요소 4개 반복 대입
for (b = a+1; b < 5; b++){ // 자신과 비교한 인덱스 제외
if(s_list[b] < s_list[sort]){ // 정렬되지 않은 요소 중 가장 작은 값 찾는 과정
sort = b;
}
}
// 선택 정렬을 통해 값 치환
temp = s_list[a]; // 임시 저장소 temp를 활용해서 값 치환
s_list[a] = s_list[sort];
s_list[sort] = temp;
}
printf("결과 > 배열 요소 : ");
for(a = 0; a < 5; a++){
printf("%d ", s_list[a]);
}
printf("\n");
return 0;
}
- 순차 탐색
배열 요소의 데이터 값을 처음부터 순서대로 하나씩 꺼내서 원하는 요소를 찾을 때 까지 탐색
배열의 모든 요소를 처음부터 끝까지 탐색하기 때문에 다소 시간이 소요됨
비교적 간단한 탐색 방식
* 예시 - 1~7 사이의 값을 입력 받아 배열에서 탐색해서 해당 인덱스를 반환하는 코드
#include <stdio.h>
#define AL 7
int main(void) {
int s_list[7] = { 3, 6, 1, 4, 7, 5, 2 };
int input, cnt;
char yn;
while(1) {
printf("1~7중에 하나를 입력하시오 => ");
scanf_s(" %d", &input);
if (input > 7 || input < 1) {
printf("숫자를 잘못 입력했습니다.\n");
continue;
}
// 입력값과 배열의 요소를 순차적으로 비교
for (cnt = 0; cnt < AL; cnt++) {
if (input == s_list[cnt]) {
printf("순차 탐색 횟수 : %d\n", cnt+1);
printf("탐색 성공 인덱스 : %d\n", cnt);
}
}
re_yn:
printf("프로그램 재실행 여부 (y/n) => ");
scanf_s(" %c", &yn, sizeof(yn));
if (yn == 'y' || yn == 'Y') {
continue;
}
else if (yn == 'n' || yn == 'N') {
break;
}
else {
printf("다시 입력하시오\n");
goto re_yn;
}
}
return 0;
}
- 이진 탐색
찾고자 하는 값을 배열의 중앙에서부터 탐색하는 방법
배열의 중앙을 기준으로 두 분으로 나누어 값의 크기를 기준으로 탐색할 방향 선정
배열이 미리 순서대로 정렬되어 있어야 사용이 가능 - 정렬되지 않았다면 먼저 정렬을 진행한 후 진행
* 예시 - 1~8 사이의 값을 입력 받아 배열에서 이진 탐색을 수행하는 코드
#include <stdio.h>
#define AL 8
int b_s(int list[], int n, int input); //사용자정의함수 선언
int main(void) {
int sno[8] = {1, 2, 3, 4, 5, 6, 7, 8};
int input, search;
char yn;
while (1) {
printf("1~8중에 하나를 입력하시오 => ");
scanf(" %d", &input);
if (input > 8 || input < 1) {
printf("숫자를 잘못 입력했습니다.\n");
continue;
}
search = b_s(sno, AL, input); // 이진 탐색 함수 호출
printf("탐색 성공 인덱스 : [%2d]\n", search);
re_yn:
printf("프로그램 재실행 여부 (y/n) => ");
scanf(" %c", &yn, sizeof(yn));
if (yn == 'y' || yn == 'Y') {
continue;
}
else if (yn == 'n' || yn == 'N') {
break;
}
else {
printf("다시 입력하시오\n");
goto re_yn;
}
}
return 0;
}
// 이진 탐색 함수
int b_s(int list[], int n, int input) {
int low = 0; // 하한값
int high = n - 1; // 상한값
int md, cnt = 1; // 중간값, 카운트 변수
while (low <= high) {
//중간값 위치 산출
md = (low + high) / 2;
// 하한과 상한 출력
printf("%d회 이진 탐색 : [%d %d] (md : %d)\n", cnt, low, high, md);
if (input == list[md]) {
return md; // 값을 찾으면 요소의 인덱스 값 반환
}
else if (input > list[md]){
low = md + 1;
}
else if (input < list[md]){
high = md - 1;
}
cnt++;
}
}
5. 다차원 배열
- 다차원 배열의 개념
배열의 크기를 지정하는 부분([ ])이 2개 이상인 배열
3차원 배열은 '배열명'[면][행][열] 형식으로 선언
- 2차원 배열
배열의 크기를 선언하는 부분이 두 개인 배열
* 2차원 배열의 선언 형식
자료형 '배열명'[행][열] 형식으로 선언
예) int arr[3][2];
* 2차원 배열 요소의 참조
인덱스 2개 필요
앞에 선언하는 인덱스는 행, 뒤에 선언하는 인덱스는 열을 의미
인덱스는 0부터 시작
예) arr[0][1];
* 2차원 배열의 초기화
1차원 배열과 마찬가지로 정수형, 실수형, 문자형 배열을 사용할 수 있음
2차원 배열을 초기화하는 3가지 방법
(1) 초깃값 나열
배열 요소의 초깃값을 나열해서 표현
2차원 배열 요소의 행과 열 구분이 쉽지 않아 권장하지 않음
예) int arr[2][3] = {1,2,3,4,5,6};
(2) 행별로 초깃값 구분
중괄호 ({ })를 사용하여 초깃값을 행별로 묶어서 구분
2차원 배열 요소를 쉽게 파악할 수 있음
예) int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
(3) 행별로 초깃값 구분 후 열별로 구분
가장 많이 사용하는 방식
중괄호({ })를 사용하여 행별로 초깃값을 구분한 뒤 다시 열별로 구분
가독성이 가장 좋음
예) int arr[2][3] = {
{1, 2, 3},
{4, 5, 6}};
- 2차원 배열의 사용
* 예시 - 3 명의 환자의 5일치 혈압 자료로 개인별 평균 혈압 산출
#include <stdio.h>
#define R 3 // 환자 수
#define C 5 // 혈압 측정 횟수
int main(void) {
int cnt, total;
float avg;
int bd[R][C+1] = { // 환자 번호, 1~5일치 혈압 기록
{220601, 135, 148, 150, 153, 161},
{220603, 115, 120, 113, 122, 124},
{220607, 134, 128, 134, 130, 129}};
printf(">> 고혈압 판정 기준 : 수축기 혈압 140 초과\n");
for (cnt = 0; cnt < R; cnt++) {
total = 0;
for(int i = 1; i <= C; i++){
total += bd[cnt][i];
}
avg = total / 5.0;
printf("\n환자 %d의 수축기 평균 혈압 및 판정\n", cnt+1);
printf("번호 : %d\n", bd[cnt][0]);
printf("평균 혈압 : %.2f\n", avg);
// 혈압 판정
if (avg > 140)
printf("판정 : 고혈압\n");
else
printf("판정 : 정상\n");
}
}
* 예시 - 2차원 배열로 학생 2명의 이름과 3개 과목의 점수를 입력받아 총점과 평균 산출
#include <stdio.h>
#define N 20 // 학생 이름 수
#define R 2 // 학생 수
#define C 3 // 과목 수
int main(void) {
int row, col, total;
float avg;
char name[N]; // 이름 저장 배열
int st[R][C]; // 점수 저장 배열
for (row = 0; row < R; row++) {
printf("> 학생 %d의 이름과 3개 과목 점수 입력\n", row + 1);
printf("%d. 이름 : ", row + 1);
scanf_s("%s", name, sizeof(name));
total = 0;
for (col = 0; col < C; col++) {
printf("과목%d 점수 : ", col + 1);
scanf_s("%d", &st[row][col]);
total += st[row][col];
}
printf("\n");
avg = total / 3.0;
printf("%s의 성적 현황 \n", name);
printf("총점 : %d\n", total);
printf("평균 : %.2f\n\n\n", avg);
}
}
* 2차원 배열을 이용한 틱택토 게임 구현
#include <stdio.h>
# define R 3 // 가로 좌표 개수
# define C 3 // 세로 좌표 개수
void grid(int tic[R][C]); // 게임판 출력 사용자정의 함수 선언
int main(void) {
int tic[R][C];
int row, col, p, g; // p : 플레이 횟수
printf("게임 실행 횟수 제한 : 총 9회\n\n");
// 게임판 초기화
for (row = 0; row < R; row++) {
for (col = 0; col < C; col++) {
tic[row][col] = ' ';
}
}
grid(tic); // 게임판 출력하는 사용자 정의 함수
// 사용자에게 위치 입력받기
printf("게임 요령 -> 허용 범위 : 0~2 로 x, y 좌표를 입력\n");
for (p = 0; p < 9; p++) {
re_play:
if (p % 2 == 0)
printf("1번 플레이어 입력 : ");
else
printf("2번 플레이어 입력 : ");
scanf("%d %d", &row, &col);
if (row < 0 || row>2 || col < 0 || col>2) {
printf("입력 오류...다시 입력하시오\n");
goto re_play;
} // 플레이어 별로 다르게 화면에 표시
tic[row][col] = (p % 2 == 0) ? 'O' : 'X';
grid(tic);
}
printf("\n\n게임 종료\n");
printf("게임 결과\n");
grid(tic);
}
void grid(int tic[R][C]) { // 게임판 출력 함수 정의
printf("|---|---|---|\n");
printf("| %c | %c | %c |\n", tic[0][0], tic[0][1], tic[0][2]);
printf("|---|---|---|\n");
printf("| %c | %c | %c |\n", tic[1][0], tic[1][1], tic[1][2]);
printf("|---|---|---|\n");
printf("| %c | %c | %c |\n", tic[2][0], tic[2][1], tic[2][2]);
printf("|---|---|---|\n");
}
* 2차원 배열을 함수의 인수로 전달
2차원 배열도 함수를 호출할 때 인수로 사용할 수 있음
배열 요소의 원본 값이 전달되므로 원본이 변경되지 않게 하려면 인수로 전달하는 배열 이름 앞에 'const' 키워드 사용
* 예시 - 5개 품목에 대한 3년간의 매출액 데이터의 총 합을 구하는 함수
#include <stdio.h>
# define Y 3 // 년도 수
# define P 5 // 제품 수
int sum(int sale[Y][P]); // 매출액 함계를 구하는 사용자 정의 함수
int main(void) {
int row, col, total = 0;
// 5가지 제품에 대한 3년 동안의 판매 기록
int sale[Y][P] = {{202, 353, 127, 85, 786},
{203, 375, 147, 95, 764},
{207, 367, 174, 76, 758}};
printf("제품별 판매액\n");
printf("A B C D E\n");
for (row = 0; row < Y; row++){
for(col = 0; col < P; col++){
printf("%d\t", sale[row][col]);
}
printf("\n");
}
total = sum(sale); // 사용자 정의 함수 호출
printf("3년간 총 매출액 : %d만원\n", total);
}
int sum(int sale[Y][P]) { // 2차원 배열을 인수로 전달받아 합계를 구하는 사용자 정의 함수
int row, col, total = 0;
for(row = 0; row < Y; row++){
for(col = 0; col < P; col++){
total += sale[row][col];
}
}
return total;
}
- 3차원 배열
* 3차원 배열의 선언 형식
2차원 배열 앞에 [면]에 해당하는 배열의 크기가 추가
[면][행][열] 순서로 배열을 선언
3차원 배열의 기본 특징징과 처리방법은 2차원배열과 비슷
예) int arr[3][2][2];
* 3차원 배열의 초기화
[면]에 해당하는 인덱스가 가장 먼저 확보되고 차례대로 [행], [열]에 해당하는 인덱스가 확보
2차원 배열과 마찬가지로 중괄호({ })를 구분자로 사용해서 초깃값 선언
배열 요소의 개수가 많아지므로 중괄호({ })로 묶어서 초깃값을 선언하는것 권장
예) int arr[2][2][2] ={{{1,2},{3,4}}
{{5,6}, {7,8}}};
* 예시 - 3차원 배열을 사용하여 인덱스 출력
#include <stdio.h>
# define P 2 // 면
# define R 2 // 행
# define C 2 // 열
int main(void) {
int pg, row, col; // 면, 행, 열의 변수
int index[2][2][2] = {{{1,2},{3,4}},
{{5,6}, {7,8}}};
for (pg = 0; pg < P; pg++){ // 면 출력
printf("[%d면 출력]\n", pg);
for (row = 0; row < R; row++){ // 행 출력
printf("%d행 출력 => ", row);
for (col = 0; col < C; col++){ // 열 출력
printf("%2d", index[pg][row][col]);
printf("[%d][%d][%d] ", pg, row, col);
}
printf("\n"); // 열을 모두 출력하면 줄 바꿈
}
}
}





댓글
댓글 쓰기