Professional Documents
Culture Documents
쉽게 풀어쓴 C언어 Express 쉽게 풀어쓴 C언어 Express: © 2012 생능출판사 All rights reserved
쉽게 풀어쓴 C언어 Express 쉽게 풀어쓴 C언어 Express: © 2012 생능출판사 All rights reserved
제10장 배열
배열을
사용하면 한
•반복의 개념 이해 번에 여러 개의
•배열의 개념 값을 저장할 수
•배열의 선언과 초기화 있는 공간을
•일차원 배열 할당받을 수
•다차원 배열 있다.
방법 #1 : 개별 변수 사용
개별변수를
int s0;
사용하는 방법은
학생수가 많아지면 int s1;
번거로워집니다. …
int s9;
방법 #1 : 배열 사용
int[10];
첨자
또는
인덱스
grade[0] grade[1] grade[2] grade[3] grade[4] grade[5] grade[6] grade[7] grade[8] grade[9]
grade[5] = 80
인덱스
grade[5] = 80;
grade[1] = grade[0];
grade[i] = 100; // i는 정수 변수
grade[i+2] = 100; // 수식이 인덱스가 된다.
grade[index[3]] = 100; // index[]는 정수 배열
return 0;
}
return 0;
}
© 2012 생능출판사 All rights reserved
잘못된 인덱스 문제
인덱스가 배열의 크기를 벗어나게 되면 프로그램에 치명적인 오류를
발생시킨다.
C에서는 프로그래머가 인덱스가 범위를 벗어나지 않았는지를 확인
하고 책임을 져야 한다.
int grade[5];
…
grade[5] = 60; // 치명적인 오류!
grade[0]=10;
grade[1]=20;
grade[2]=30;
grade[3]=40;
grade[4]=50;
grade[5]=60;
0 0
grade[0] grade[1] grade[2] grade[3] grade[4]
int grade[ ] = { 10 , 20 , 30 , 40 , 50 , 60 };
return 0;
}
grade[0] = 31
grade[1] = 63
grade[2] = 62
grade[3] = 87
grade[4] = 14
return 0;
}
grade[0] = 31
grade[1] = 63
grade[2] = 0
grade[3] = 0
grade[4] = 0
return 0;
}
grade[0]=4206620
grade[1]=0
grade[2]=4206636
grade[3]=2018779649
grade[4]=1
return 0;
}
grade[0]=4206620
grade[1]=0
grade[2]=4206636
grade[3]=2018779649
grade[4]=1
int grade[] = { 1, 2, 3, 4, 5, 6 };
int i, size;
배열 원소 개수 자동 계산
#include <stdio.h>
#define SIZE 5
int main(void)
{
int i;
int a[SIZE] = {1, 2, 3, 4, 5};
int b[SIZE];
올바른 방법
int main(void)
{
int i;
int a[SIZE] = { 1, 2, 3, 4, 5 };
int b[SIZE] = { 1, 2, 3, 4, 5 };
if( a == b ) // ① 올바르지 않은 배열 비교
printf("잘못된 결과입니다.\n");
else
printf("잘못된 결과입니다.\n");
좌석을 예약하시겠습니까?(y 또는 n) y
-------------------------------
1 2 3 4 5 6 7 8 9 10
-------------------------------
0000000000
몇번째 좌석을 예약하시겠습니까?1
예약되었습니다.
좌석을 예약하시겠습니까?(y 또는 n) y
-------------------------------
1 2 3 4 5 6 7 8 9 10
-------------------------------
1000000000
몇번째 좌석을 예약하시겠습니까?1
이미 예약된 자리입니다. 다른 좌석을 선택하세요
좌석을 예약하시겠습니까?(y 또는 n) n
---------------------------------------
1 2 3 4 5 6 7 8 9 10
---------------------------------------
28 81 60 83 67 10 66 97 37 94
최소값은 10입니다.
50 40 30 20 10 20 30 40 60 70
grade[0] grade[1] grade[2] grade[3] grade[4] grade[5] grade[6] grade[7] grade[8] grade[9]
<
<
<
<
>
>
>
>
>
40
30
20
50
10
min
값 득표결과
1 2
2 0
3 0
4 0
...
9 0
10 0
+1
0 0 0
1
100
score SIZE = 101
return 0;
}
#define SIZE 6
int main(void)
{
int freq[SIZE] = { 0 }; // 주사위의 면의 빈도를 0으로 한다.
int i;
printf("====================\n");
printf("면 빈도\n"); ====================
printf("====================\n"); 면 빈도
====================
0 1657
for(i = 0; i < SIZE; i++) 1 1679
printf("%3d %3d \n", i, freq[i]); 2 1656
3 1694
return 0; 4 1652
} 5 1662
sum += score[i];
...
}
int main(void)
{
int grade[STUDENTS] = { 1, 2, 3, 4, 5 };
int avg; 배열이 인수인 경우,
참조에 의한 호출
avg = get_average(grade, STUDENTS);
printf("평균은 %d입니다.\n", avg);
return 0; 배열의 원본이
} score[]로 전달
int main(void)
{
int list[SIZE] = { 1, 2, 3, 4, 5, 6, 7 } ;
return 0;
}
5 3 8 1 2 7
int main(void)
{
int list[SIZE] = { 3, 2, 9, 7, 1, 4, 8, 0, 6, 5 };
int i, j, temp, least;
내부 for 루프로서 (i+1)번째 원소부터 배열의 마
for(i = 0; i < SIZE-1; i++) 지막 원소 중에서 최소값을 찾는다. 현재의 최소
{ 값과 비교하여 더 작은 정수가 발견되면 그 정수
least = i; 가 들어 있는 인덱스를 least에 저장한다.
for(j = i + 1; j < SIZE; j++)
if(list[j] < list[least])
least = j;
0123456789
temp = list[i];
list[i] = list[least];
list[least] = temp;
}
올바른 방법
temp = list[i];
list[i] = list[least];
list[least] = temp;
50 성공
비교
1 20 30 40 50 10
0grade[0] grade[1] grade[2] grade[3] grade[4] grade[5]
int main(void)
{
int key;
int grade[SIZE] = { 2,6,11,13,18,20,22,27,29,30,34,38,41,42,45,47 };
printf("탐색할 값을 입력하시오:");
scanf("%d", &key);
printf("탐색 결과= %d\n", binary_search(grade, SIZE, key));
return 0;
}
탐색할 값을 입력하시오:34
[0 15]
[8 15]
[8 10]
[10 10]
탐색 결과= 10
int main(void)
{
int s[3][5]; // 2차원 배열 선언
int i, j; // 2개의 인덱스 변수
int value = 0; // 배열 원소에 저장되는 값
for(i=0;i<3;i++)
for(j=0;j<5;j++)
s[i][j] = value++;
0
for(i=0;i<3;i++) 1
2
for(j=0;j<5;j++) 3
printf("%d\n", s[i][j]); ...
11
12
13
return 0; 14
}
#include <stdio.h>
int main(void)
{
int s[3][3][3]; // 3차원 배열 선언
int x, y, z; // 3개의 인덱스 변수
int i = 1; // 배열 원소에 저장되는 값
for(z=0;z<3;z++)
for(y=0;y<3;y++)
for(x=0;x<3;x++)
s[z][y][x] = i++;
return 0;
}
© 2012 생능출판사 All rights reserved
다차원 배열 인수
#include <stdio.h>
총매출은 45입니다.
#define YEARS 3
#define PRODUCTS 5
int main(void)
{
int sales[YEARS][PRODUCTS] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
int total_sale;
total_sale = sum(sales);
int main(void)
{
int s[CLASSES][STUDENTS] = {
{ 0, 1, 2, 3, 4 }, // 첫번째 행의 원소들의 초기값
{ 10, 11, 12, 13, 14 }, // 두번째 행의 원소들의 초기값
{ 20, 21, 22, 23, 24 }, // 세번째 행의 원소들의 초기값
};
int clas, student, total, subtotal;
total = 0;
for(clas = 0; clas < CLASSES; clas++)
{
subtotal = 0;
for(student = 0; student < STUDENTS; student++)
subtotal += s[clas][student];
printf("학급 %d의 평균 성적= %d\n", clas, subtotal / STUDENTS);
total += subtotal;
}
printf("전체 학생들의 평균 성적= %d\n", total/(CLASSES * STUDENTS));
return 0;
}
while(done != 1) {
printf("(x, y) 좌표(종료-1, -1): ");
scanf("%d %d", &x, &y);
if( x == -1 && y == -1 ) return 1;
if(board[x][y]== ' ') break; // 올바른 위치이면 반복 루프를 나간다.
else printf("잘못된 위치입니다.\n"); }
}
return 0;
}