공부/C programming

7. 배열

natom_ 2016. 4. 15. 12:13
반응형

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


<실행결과>















반응형

'공부 > C programming' 카테고리의 다른 글

8. 함수  (0) 2016.05.10
D  (0) 2016.05.03
6. 전처리기  (0) 2016.04.15
5. 제어문  (0) 2016.03.29
4. 연산자  (0) 2016.03.22