1. 배열의 개념
배열의 개념으로는 자료형이 같은 여러개의 기억장소에 같은 이름(배열명)으로 저장한 것이라고 말 할 수 있다.
2. 배열 선언시 주의사항 (p256, p257)
- 배열 원소수와 상관없이 배열에 저장되는 모든 값의 자료형은 같아야한다.
- 배열 원소수는 배열의 크기를 의미하며 정수형 상수만 가능하다. 그러므로 매크로 상수는 가능하나 int m-10; int data[n]; 처럼 변수를 원소수로 사용할 수 없다.
- int quiz[]; 와 같이 초깃값을 명시하지 않으면서 []안의 배열 원소수를 생략하면 에러다.
- {} 안의 초깃값이 배열 원소수보다 많으면 에러다.
- 배열 원소를 명시하기 위해 사용하는 첨자는 0부터 시작하며 마지막 원소의 첨자는 (배열원소수-1)임을 명심해야한다.
3. 배열의 초기화 방법 3가지 (p256)
int quiz[5]={8,9,10,8,7}; |
{}안의 값이 배열 원소에 순서대로 저장되어 quiz[0]에는 8, quiz[1]에는 9,...순으로 저장된다. |
int sum[100]={0}; |
{}안의 초깃값 갯수가 배열 원소수보다 적으면 나머지 원소는 0으로 초기화 된다. 많은 배열 원소를 한꺼번에 초기화할때 유용하다. |
int error[]={0,1,0,2,3,0,1}; |
배열 원소수를 명시하지 않으면 {}안의 값 갯수가 배열 원소수로 결정된다. |
4. 배열 사용예 (프로그램 7-1, 소스코드, 실행결과)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 |
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5 //배열 원소수 5를 매크로 상수 SIZE로 정의
int main(int argc, char *argv[]) {
int quiz[SIZE]; //정수 SIZE개를 저장할 배열 선언
int i, count, sum;
double avg;
//배열의 입력
printf("%d명의 점수를 순서대로 입력하세요.\n\n",SIZE);
for(i=0;i<SIZE;i++)
{
printf("%d번의 퀴즈 점수는? ",i+1);
scanf("%d",&quiz[i]);
}
//배열의 평균 구하기
sum=0;
for(i=0;i<SIZE;i++)
sum = sum+quiz[i];
avg = (double)sum/SIZE;
//평균 미만자 수 구하기
count = 0;
for(i=0;i<SIZE;i++)
if(quiz[i]<avg)
count++;
//결과 출력
printf("============================================\n");
printf(" 번호 점수 평균과의 차이 \n");
printf("============================================\n");
for(i=0;i<SIZE;i++)
printf(" %2d %2d %5.1lf\n",i+1,quiz[i],quiz[i]-avg);
printf("============================================\n");
printf("평균 : %.1lf점\n",avg);
printf("============================================\n");
printf("평균 미만 : %d명\n",count);
return 0;
} |
cs |
5. 배열 응용 예1 - 최소값구하기(프로그램 7-2, 소스코드, 실행결과)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 |
#include <stdio.h>
#include <stdlib.h>
#define N 5
int main(int argc, char *argv[]) {
int f[N] = {3,0,-30,-20,-1}; //배열을 선언과 동시에 초기화하기
int i, min;
//최솟값 구하기
min = f[0];
for(i=1;i<N;i++)
{
if(f[i]<min)
min=f[i];
}
//배열 내용 출력
printf("어는 점 목록 : ");
for(i=0;i<N;i++)
printf("%4d",f[i]);
//최솟값 출력
printf("\n\n가장 낮은 어는점 : %d\n",min);
return 0;
} |
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 |
#include <stdio.h>
#include <stdlib.h>
#define N 5
int main(int argc, char *argv[]) {
int f[N] = {3,0,-30,-20,-1}; //배열을 선언과 동시에 초기화하기
int i, max;
//최댓값 구하기
max = f[0];
for(i=1;i<N;i++)
{
if(f[i]>max)
max=f[i];
}
//배열 내용 출력
printf("어는 점 목록 : ");
for(i=0;i<N;i++)
printf("%4d",f[i]);
//최댓값 출력
printf("\n\n가장 높은 온도 : %d\n",max);
return 0;
} |
cs |
6. 배열 응용 예2 - 버블정렬(프로그램 7-4, 소스코드, 실행결과)
(1) 정렬방법1 - 오름차순 정렬(내림차순을 오름차순으로)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 |
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
int main(int argc, char *argv[]) {
int a[SIZE]={5,4,3,2,1};
int i, temp, repeat;
printf("정렬 전 배열 \n");
for(i=0;i<SIZE;i++)
printf("%d ",a[i]);
for(repeat=1;repeat<SIZE;repeat++)
{
for(i=0;i<SIZE-1;i++)
{
if(a[i] > a[i+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
printf("\n정렬 후 배열 \n");
for(i=0;i<SIZE;i++)
{
printf("%d ",a[i]);
}
return 0;
}
|
cs |
※ 정렬 전 배열을 출력하게 하고, temp변수를 사용하여 빈공간을 할당해준다.
그리고 그 공간에 배열의 첫번째와 두번째, 두번째와 세번째,...,순으로 값을 비교하여
오름차순으로 정렬하게 하였다.
<실행결과>
(2) 정렬방법2 - 내림차순 정렬(오름차순을 내림차순으로)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 |
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
int main(int argc, char *argv[]) {
int a[SIZE]={1,2,3,4,5};
int i, temp, repeat;
printf("정렬 전 배열 \n");
for(i=0;i<SIZE;i++)
printf("%d ",a[i]);
for(repeat=1;repeat<SIZE;repeat++)
{
for(i=0;i<SIZE-1;i++)
{
if(a[i] < a[i+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
printf("\n정렬 후 배열 \n");
for(i=0;i<SIZE;i++)
{
printf("%d ",a[i]);
}
return 0;
}
|
cs |
※ 정렬 전 배열을 출력하게 하고, temp변수를 사용하여 빈공간을 할당해준다.
그리고 그 공간에 배열의 첫번째와 두번째, 두번째와 세번째,...,순으로 값을 비교하여
오름차순으로 정렬하게 하였다.
<실행결과>
7. 배열응용 예3 : 설문조사 프로그램(프로그램 7-3, 소스, 주석, 실행결과)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 |
#include <stdio.h>
#include <stdlib.h>
#define PERSONS 30 //설문 조사 응답수
#define STARS 6 //연예인 번호와 vote배열의 첨자를 일치시키기 위해 연예인 수 +1
int main(int argc, char *argv[]) {
int survey[PERSONS]={1,3,2,5,3,2,1,2,3,4,5,2,3,3,2,
1,4,5,2,3,5,1,3,4,2,3,1,4,2,3};
int vote[STARS]={0};
int i;
for(i=0;i<PERSONS;i++)
{
vote[survey[i]]++;
//응답자가 답한 연예인(survey[i])의 득표수를 1 증가
}
printf("연예인 득표수\n");
printf("====================\n");
for(i=1;i<STARS;i++) //vote[0]에는 아무런 자료도 저장되어 있지 않다.
printf(" %d번 %d표 \n",i,vote[i]);
return 0;
} |
cs |
※ 30개의 설문 조사 응답 정보를 저장하는 배열 survey, 각 연예인의 득표수를 저장하는 배열 vote, 해당 연예인의 득표수 누적
survey[i]에서 응답자가 응답한 연예인 번호를 득표수를 누적할 배열의 첨자로 활용한다.
<실행 결과>
8. 배열 응용 예4 - 개선된 버블정렬(프로그램 7-5, 소스코드, 실행결과)
주석 : 개선된 버블정렬과 기본적인 버블정렬의 차이점 설명
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 |
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
int main(int argc, char *argv[]) {
int i, repeat, temp, a[SIZE]={5,4,3,2,1};
printf("정렬 전 배열 >> ");
for(i=0;i<SIZE;i++)
{
printf("%d ",a[i]);
}
//버블 정렬 시작
for(repeat=1;repeat<SIZE;repeat++) //(배열원소수-1)번 반복하기
{
//배열의 이웃한 두 원소간의 정렬을 차례대로 반복하기
for(i=0;i<SIZE-1;i++)
{
//이웃 두 원소의 정렬
if(a[i]>a[i+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
} //안쪽 for문의 끝
} //바깥쪽 for문의 끝
printf("\n\n정렬 후 배열 >> ");
for(i=0;i<SIZE;i++)
{
printf("%d ",a[i]);
}
return 0;
} |
cs |
※ 버블 정렬이란 배열에서 이웃하는 두 원소씩 차례대로 정렬하는 작업을 반복함으로써 배열 전체를 정렬하는 방법이다.
소스코드에서 a[i]와 a[i+1]에 저장된 값을 서로 교환하기 위해 temp변수를 사용하는 것을25~27행을 통해 확인할 수 있다.
for문 전에 정렬 전 배열을 출력시켜 주었고, for문을 통해 정렬을 한 배열을 for문 뒤에 출력시켜 주었다.
<실행 결과>
9. 배열 응용 예5 - 최적화된 버블정렬(프로그램 7-6, 소스코드, 실행결과)
주석 : 최적화된버블정렬의 원리 설명
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 |
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
int main(int argc, char *argv[]) {
int i, repeat,temp,b[SIZE]={1,2,3,5,4};
char swap;
//이웃 두 원소의 값이 교환된 적이 있는 지를 알려주는 변수
//버블 정렬 시작
for(repeat=1;repeat<SIZE;repeat++)
{
swap='N'; //두 원소 간에 교환이 발생하지 않은 상태로 초기화
for(i=0;i<SIZE-repeat;i++)
{
if(b[i]>b[i+1])
{
temp = b[i];
b[i] = b[i+1];
b[i+1] = temp;
swap = 'Y';
//두 원소간에 교환이 발생한 상태로 수정
}
}
if(swap=='N') //두 원소간에 교환이 발생한 적이 없는 정렬완료상태라면
break; //정렬 작업 끝내기
}
//정렬된 결과를 출력하기
printf("\n 정렬 후 배열 : ");;
for(i=0;i<SIZE;i++)
printf("%4d",b[i]);
printf("\n\n");
return 0;
} |
cs |
※ 변수의 기능으로는 초깃값을 준다는것과 상태를 확인한다는 기능이있다.
여기서 swap변수는 상태체크를 위한 변수로 사용되었다.
for문에서 값의 변화의 유무에 따라 swap변수의 상태를 변화시켜 주었다.
<실행 결과>
10. 2차원배열
(1)초기값 선언방법 (1,2,3)
자료형 배열명[행 개수][열 개수]; |
자료형 배열명[행수][열수] = {{1행 초깃값 목록},{2행 초깃값 목록},....,{마지막 행 초깃값 목록}}; |
배열명[행 첨자][열 첨자] |
① int matrix[2][3]; //2행 3열의 행렬을 저장하기 위한 배열
② int test[3][4]; //3명의 4번의 시험 점수를 저장하기 위한 배열
③ double average[3][8]; //1,2,3학년의 각 반별 평균 점수 8개를 저장하기 위한 배열
(2)2차원 배열 선언시 주의사항
① 바깥 {} 안에 명시한 {} 순서대로 한 행씩 초기화 된다.
② 행의 개수를 생략할 수 있다. 그러나 열의 개수는 반드시 명시해야한다.
③ [][]와 같이 행과 열의 수를 둘 다 명시하지 않으면 에러가 발생한다.
(3) 예제
int matrix[2][3]선언과 활용실습 소스코드, 주석, 실행결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 |
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int matrix[2][3] = {{1,2,3},{4,5,6}};
int row,col;
for(row=0;row<2;row++)
{
for(col=0;col<3;col++)
printf("%d\t",matrix[row][col]);
printf("\n");
}
return 0;
} |
cs |
<실행 결과>
11. 문자열 배열 선언 방법
C언어에서 문자열을 처리하는 방법은 char형 배열을 이용하는 방법과 char형 포인터를 이용하는 방법 두가지가 있다.
문자열을 저장할 배열 선언하는 방법으로 의 예는 세가지가 있다.
√ char c[6];
√ char c[6] = {'S','e','o','u','l'};
√ char c[6] = "Seoul";
여기서 주의해야 할 사항으로는 배열을 입력받기 위해 scanf 와 gets를 사용할때 주소연산자'&'를 사용하면 안된다는것이다.
그 이유로는 배열에서 배열명 자체가 배열의 시작주소를 나타내므로 주소연산자를 사용하게 되면 쓰레기값을 갖게 된다.
앞서 본 것 과 같이 scanf로 문자를 입력 받게 되면, 공백 입력시 문자열의 종료를 나타나게 되므로 공백 뒤에 문자열은 출력을 하지 못하게 된다.
공백까지 하나의 문자열로 입력하고싶다면 gets함수를 사용한다.
12. 문자열 예제(p.238) 소스코드,결과
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { //주민등록번호로부터 태어난 연도와 성별을 출력하기 char id[14]="9011032683231"; //주민등록번호를 문자열로 배열에 저장하기 //처음 두 문자를 이용하여 출생 연도를 출력하기 printf("%c%c년도에 태어난 ",id[0],id[1]); //일곱번째 문자를 이용하여 성별을 출력하기 if(id[6]=='1'||id[6]=='3') printf("남자"); else if(id[6]=='2'||id[6]=='4') printf("여자"); else printf("사람이 아닙니다."); return 0; } | cs |
<실행 결과>
13. 프로그램 7-8 소스코드, 결과
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char univ[11],std_no[9],name[10]; int i, j; //사용자의 정보를 입력받기 printf("학교명은? "); scanf("%s",univ); printf("학번은? "); scanf("%s",std_no); fflush(stdin); //버퍼를 비워주기 위해 사용 printf("이름은? "); gets(name); //빈 칸이 포함된 이름도 입력 받을수 있도록 gets함수를 사용 printf("===========================\n"); printf("%s %c%c학번 %s\n",univ,std_no[2],std_no[3],name); printf("===========================\n"); return 0; } | cs |
<실행 결과>
14. 학생 정보 조회 시스템(프로그램 7-9 소스코드,결과)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include <stdio.h> #include <stdlib.h> #include <string.h> //strcmp함수를 위한 헤더파일 #define N 10 int main(int argc, char *argv[]) { char name[N][9]={"홍길동","이몽룡","성춘향","제갈공명","주몽", "배장화","배홍련","홍길동","연흥부","연놀부"}; char phone[N][14]={"010-5210-1234","010-523-1628","010-1235-8765", "010-345-1676","010-5210-5463","010-523-7979" "010-5210-1472","010-8255-8255","010-516-3483","010-8282-8282"}; double grade[N]={4.2,4.0,3.2,4.4,3.7,2.9,4.0,3.8,3.2,2.7}; char who[9]; int cnt, i; printf("정보를 찾고 싶은 학생 이름은? "); scanf("%s",who); printf("\n\n"); printf("====================================\n"); printf(" 이름 전화번호 평점 \n"); printf("====================================\n"); /* 사용자가 찾는 문자열 who와 name배열에 저장된 문자열 name[i]를 차례대로 비교하면서 같은 이름을 찾을 때 마다 카운터를 1 증가하고 그 학생의 이름, 전화번호, 평점 출력하기*/ cnt=0; for(i=0;i<N;i++) if(strcmp(who,name[i])==0) { cnt++; printf(" %-10s %-14s %5.1lf \n",name[i],phone[i],grade[i]); } printf("===================================\n"); if(cnt==0) printf(" %s(이)라는 학생은 없습니다.\n",who); else printf(" 총 %d명의 학생을 찾았습니다. \n",cnt); return 0; } | cs |
<실행결과>