본문으로 바로가기

[C언어] 배열

category C 2014. 5. 12. 10:05

 이름 국어 영어 수학 점수를 입력받아 총점과 평균을 구하는 프로그램을 작성하시오!
(이름, 국어, 수학, 총점, 평균 순으로 출력한다.)

 

#include <stdio.h>
void main()
{
    char name[10];
    int kor, eng, mat, tot;
    float ave;
    printf("이름 국어 영어 수학 순으로 입력하세요\n");
    scanf("%s%d%d%d", name, &kor, &eng, &mat);
    tot = kor + eng + mat;
    ave = tot / 3.0f;

    printf("이름: %s kor(%d) eng(%d) mat(%d) tot(%d) ave(%.1f)\n",
        name, kor, eng, mat, tot, ave);
}

<생각해보기>

1명의 학생이 아니라 5명의 학생에 대해 처리하는 프로그램으로 수정해야 한다면?

 

#include <stdio.h>
void main()
{
    char name1[10];
    int kor1, eng1, mat1, tot1;
    float ave1;
    printf("이름 국어 영어 수학 순으로 입력하세요\n");
    scanf("%s%d%d%d", name1, &kor1, &eng1, &mat1);
    tot1 = kor1 + eng1 + mat1;
    ave1 = tot1 / 3.0f;

 

    char name2[10];
    int kor2, eng2, mat2, tot2;
    float ave2;
    printf("이름 국어 영어 수학 순으로 입력하세요\n");
    scanf("%s%d%d%d", name2, &kor2, &eng2, &mat2);
    tot2 = kor2 + eng2 + mat2;
    ave2 = tot2 / 3.0f;

 

    char name3[10];
    int kor3, eng3, mat3, tot3;
    float ave3;
    printf("이름 국어 영어 수학 순으로 입력하세요\n");
    scanf("%s%d%d%d", name3, &kor3, &eng3, &mat3);
    tot3 = kor3 + eng3 + mat3;
    ave3 = tot3 / 3.0f;

 

    char name4[10];
    int kor4, eng4, mat4, tot4;
    float ave4;
    printf("이름 국어 영어 수학 순으로 입력하세요\n");
    scanf("%s%d%d%d", name4, &kor4, &eng4, &mat4);
    tot4 = kor4 + eng4 + mat4;
    ave4 = tot4 / 3.0f;

 

    char name5[10];
    int kor5, eng5, mat5, tot5;
    float ave5;
    printf("이름 국어 영어 수학 순으로 입력하세요\n");
    scanf("%s%d%d%d", name5, &kor5, &eng5, &mat5);
    tot5 = kor5 + eng5 + mat5;
    ave5 = tot5 / 3.0f;

 

    printf("이름: %s kor(%d) eng(%d) mat(%d) tot(%d) ave(%.1f)\n",
        name1, kor1, eng1, mat1, tot1, ave1);
    printf("이름: %s kor(%d) eng(%d) mat(%d) tot(%d) ave(%.1f)\n",
        name2, kor2, eng2, mat2, tot2, ave2);
    printf("이름: %s kor(%d) eng(%d) mat(%d) tot(%d) ave(%.1f)\n",
        name3, kor3, eng3, mat3, tot3, ave3);
    printf("이름: %s kor(%d) eng(%d) mat(%d) tot(%d) ave(%.1f)\n",
        name4, kor4, eng4, mat4, tot4, ave4);
    printf("이름: %s kor(%d) eng(%d) mat(%d) tot(%d) ave(%.1f)\n",
        name5, kor5 ,eng5, mat5, tot5, ave5);
}

 

 

 

 

 

 

배열(Array)이란?

연속된 동일한 자료형의 집합이다.

배열은 가장 기본이 되는 자료구조이기도 하며, 정말 유용하게 쓰인다.

 

자료형 배열명[크기];

<주의> 크기는 항상 상수가 되어야 한다. 즉 변수가 올 수 없다.

 

예1)

char a[4] = "Neo"; // 문자열일 경우에만 ""로 초기화 시킬수 있으며  
                            // 아래처럼 초기화 시키면 문자열일 경우 불편하다.

char a[4] = {'N', 'e', 'o'}; // 수학의 집합처럼 초기화 시킬 수 있다.

 

 

a

&a[0]

 

&a[1]

 

&a[2]

 

&a[3]

 

 

 

 

1000

1001

1002

1003

 

 

 

 

N

e

o

\0

 

 

 

 

a[0]

a[1]

a[2]

a[3]

 

 


 

배열명 a 는 배열의 시작주소(변수가 아니라 상수)이다.

문자열을 나타내는 char 형의 배열일 경우 문자열의 끝을 알리는

'\0'(NULL)이 항상 배열내에 존재해야한다.

 

인덱스(첨자)를 이용해서 내용을 수정할 수 있다.

배열의 인덱스는 0 부터 시작한다. a[n] 의 경우 a[0]~a[n-1] 로 이루어져 있다.

a[0] = 'J';

a[1] = 'o';

a[2] = 'e';

 

<주의사항>

a = "xyz"; // 가능할까?

 

예2)

int b[4] = {0, 4,1,5};

 

 

b

&b[0]


&b[1]

 

&b[2]

 

&b[3]

 

 

 

 

2000

2004

2008

2012

 

 

 

 

0

4

1

5

 

 

 

 

b[0]

b[1]

b[2]

b[3]

 

 

배열명 b 는 배열의 시작주소이다.

 

인덱스(첨자)를 이용해서 내용을 수정할 수 있다.

b[0] = 9;

b[1] = 8;

b[2] = 7;

b[3] = 6;

 

<주의사항>

b = {1, 2, 3, 4}; // 가능할까?

 

<예제>

 

MAX 명의 점수를 입력받아 역순으로 출력하는 프로그램

 

#include <stdio.h>

#define MAX 5

void main()

{

    int iScore[MAX], i;

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

    {

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

    }

    for (i = MAX - 1; i >= 0; --i)

    {

        printf("%d ", iScore[i]);

    }
}

 

 

<실습1>  

MAX 명 이름 국어 영어 수학 점수를 입력받아 총점과 평균을 구하는 프로그램을 작성하시오!
(이름, 국어, 수학, 총점, 평균 순으로 출력한다.)

 

<실습2> 

실습1 + 등수 포함

(이름, 국어, 수학, 총점, 평균, 등수 순으로 출력한다.)

자신 다른사람
i       j
[0]  [0,1,2,3,4]  
if (tot[0] < tot[0,...4])
{
 ++rank[0];
}
[1]  [0,1,2,3,4] 
if (tot[1] < tot[0,...4])
{
    ++rank[1];
}
[2]  [0,1,2,3,4] 
if (tot[2] < tot[0,...4])
{
    ++rank[2];
}
[3]  [0,1,2,3,4] 
if (tot[3] < tot[0,...4])
{
 ++rank[3]
}
[4]  [0,1,2,3,4] 
if (tot[4] < tot[0,...4])
{
    ++rank[4]
}

for (int i = 0; i < 5; ++i) //  자기 자신 i
{
 for (int j = 0; j < 5; ++j)//  비교대상 다른사람 j
 {
  
 }
}

 

<실습3> 

실습2 + 등수순으로 출력

(이름, 국어, 수학, 총점, 평균, 등수 순으로 출력한다) + 등수를 오름차순(1등부터 차례대로 출력)

 

 

 

다차원 배열

지금까지 배운 배열은 1차원 배열이라고 하고 첨자를 두개 사용하면 2차원배열 세개 사용하면 3차원 배열 n개를 사용하면 n차원 배열이 된다.

 

int c[2][3] = { 1, 2, 3, 4, 5, 6};

또는

int c[2][3] = { {1, 2, 3}, {4, 5, 6} };

 

c[0][0]

c[0][1]

c[0][2]

c[1][0]

c[1][1]

c[1][2]

 

예1)

#include <stdio.h>
void main()
{
    int c[2][3] = { 1, 2, 3, 4, 5, 6};
    for (int i = 0; i < 2; ++i)
    {
         for (int j = 0; j < 3; ++j)
        {
            printf("%d ", c[i][j]);
        }
        printf("\n");
    }
}

<출력결과>

1 2 3
4 5 6
Press any key to continue

 

개념상 2차원배열은 n*m 박스의 형태를 보여주고 있으나,
메모리는 선형적이기 때문에 실제로는 아래와 같이 메모리에 위치해 있다.

 

3000

c

c[0]

&c[0][0]

3004

 

c[0]+1

&c[0][1]

3008

 

c[0]+2 

&c[0][2]

3012

c+1

c[1]

&c[1][0]

3016

 

c[1]+1

&c[1][1]

3020

 

c[1]+2 

&c[1][2]

1

2

3

4

5

6

c[0][0]

c[0][1]

c[0][2]

c[1][0]

c[1][1]

c[1][2]

 

c+1 => c+1*sizeof(int)*3

c[0]+1 => c[0]+1*sizeof(int)

 

예2)

#include <stdio.h>
void main()
{
    int c[2][3] = {1, 2, 3, 4, 5, 6};
    unsigned int idx = 0;
    for (int i = 0; i < 2; ++i)
    {
        for (int j = 0; j < 3; ++j)
        {
              printf("%p:%p[%d][%d]=%d ", 
                      &c[i][j], &c[0][0] + idx, 
                       i, j,
                     *(c[0] + idx));
              ++idx;
        }
        printf("\n");
    }
}

 

<출력결과>

0013FEC0:0013FEC0[0][0]=1 0013FEC4:0013FEC4[0][1]=2 0013FEC8:0013FEC8[0][2]=3
0013FECC:0013FECC[1][0]=4 0013FED0:0013FED0[1][1]=5 0013FED4:0013FED4[1][2]=6
Press any key to continue

 

 

<실습4> 

반 3명, 학년 2학급 (전체등수 추가 및 전체등수순으로 출력)