제 6장



맨 아래에 '숙제'있음

[배열]
- 배열(array): 여러개의 같은 자료형의 값들의 모임을 나타내는 자료형

- 예) 5명의 성적 표현
  배열을 사용하지 않는 경우
  int grade0, grade1, grade2, grade3, grade4;    ....개별적으로 선언

  배열을 사용한 경우
  int grade[5];    ..... 변수 grade는 5원소로 구성된 배열
                              1개의 이름으로 5원소 나타냄

- 자료구조(data structure)
   함수는 프로그램을 조직화하는 방법을 제공
   자료구조는 자료를 조직화하는 방법을 제공

[배열선언]
- int grade[5];   ... grade[0],  int grade[1], int grade[2], int grade[3], int grade[4]  .... 정수 배열 선언
  char s[80];    .... 문자 배열 선언
  int a[10], b[5], c;

- 배열 원소 접근: 첨자(index)는 0부터 n-1까지

- 첨자는 정수식으로 표현가능, 첨자가 유효한 범위 내에 있어야 함
  grade[2]    grade[k]    grade[3*k+2]    .... k는 정수형 변수

[배열의 치환과 비교]
- 배열 전체를 비교하거나 치환 할 수 없음
   int a[10], b[10];
   ...
   a=b;                                                  ... 틀렸음: 배열 치환 불가
   if(a=b) printf("두 배열은 같습니다\n");   ... 틀렸음: 배열 비교 불가

- 배열의 치환과 비교는 원소 단위로 수행해야 함
  for (i=0; i<10; i++)       .... 배열의 치환
  a[i] = b[i]

  same = 1;
  for (i=0; i<10; i++)
       if (a[i] != b[i]){same 0;  break;}
   if same==1) printf("두 배열은 같습니다\n");

[배열의 초기화]
- 배열 원소도 선언을 할 때에 초기화 할 수 있음
   int a[4] = {10,20,30,40};
   int a[4] = {10,20);     -> int a[0]=10, int a[1]=20, int a[3]=0, int a[4]=0
   int a[] = {10,20,30,40};

[다차원 배열]
- 다차원 배열: 1개의 첨자에 의해서 원소가 구분됨
   1차원 배열: 1개의 첨자에 의해서 원소가 구분됨
   2차원 배열: 2개의 첨자에 의해서 원소가 구분됨
   n차원 배열: n개의 첨자에 의해서 원소가 구분됨

- 다차원 배열 선언
   int a[4];                  .... 1차원 배열, 4원소
   int b[2][4];              .... 2차원 배열(2행 4열), 2 x 4 = 8원소
   int c[3][2][4];         .... 3차원 배열(3면 2행 4열), 3 x 2 x 4 = 24원소

- 배열 원소 접근
  b[0][3]     .... 첨자는 행 0~1, 열 0~3까지 사용 가능 (행을 먼저 써준다)
  c[p][q][r] .... 첨자는 정수식 사용가능

[배열의 기본장소 배치] => 초보자는 궂이 알 필요가 없다

[다차원 배열 초기화]
- 초기값은 기억장소 배치 순서대로 지정됨
   int b[2][4] = {{1,2,3,4},{5,6,7,8}   (권장)
   int b[2][4] = {1,2,3,4,5,6,7,8}        (가능)

사용자 삽입 이미지

[배열과 함수]
- 배열은 함수의 인수로 사용될 수 있다.
   베열의 크기는 지정할 필요가 없음
   double average(double data[])      .... 배열의 크기 지정하지 않음
   {
    ...
    }
   인수로 전단되는 배열은 호출하는 측에서 선언되어 있음
   배열의 크기를 함께 선언해도 무방하지만 아무런 의미가 없음
   double averge(double data[])   .... 임의의 크기의 배열에 사용 가능
   {
    ...
    }
   배열은 함수 반환값으로 사용할 수 없음

[예) 배열을 인수로 사용하는 함수]

사용자 삽입 이미지
사용자 삽입 이미지

[다차원 배열 인수]
- 다차원 배열 인수: 첫번째 첨자를 제외한(첫번째도 지정 가능) 나머지 첨자의 크기는 지정해야 함
   double max_elem(int a[][3])
   {
    ...
    }

[배열 인수와 보통 인수의 차이
- 보통인수: 함수에서 형식 인수의 값이 바뀌더라도 이 함수를 호출한 측에서 실 인수로 사용된 변수에는 영향없음
- 배열인수: 함수에서 사용되는 배열은 이 함수를 호출한 측에서 실 인수로 사용된 배열과 같은 배열임

사용자 삽입 이미지


[변수의 접근 수정자] => 일반 사용자에게는 별 의미없다]

[선택정렬(sorting)]
- 정렬: 자료를 순서대로 나열하는 것

- 선택정렬
   n개의 자료 중 가장 작은 자룔르 찾아서 첫째 원소와 교환
   나머지 n-1개 자료 중 가장 작은 자료를 찾아서 둘째 원소와 교환
   이러한 방식을 1개 자료가 남을 때까지 반복 수행

사용자 삽입 이미지

사용자 삽입 이미지

== 실습시간 ==
사용자 삽입 이미지


#include <stdio.h>

int main(void)
{
 int monthday[12] = {31,30,31,30,31,30,31,31,30,31,30,31}; /* 한 달의 날 수 */
 int year, month, day;
 int count, i;
 int isleep;

 printf("연 월 일을 다음의 형식으로 입력하시오. (2006 4 10) >\n");
 scanf("%d %d %d",&year,&month,&day);

 count = 0;
 for (i=1;i<month;i++)        /* 전 월까지의 날 수 계산 */
  count = count + monthday[month-1];    /* 해당 전 월까지의 날 수를 구함 */
 count = count + day;        /* 전 월 날수 + 해당 월 일자수 */
 isleep = (year%4==0 && year%100 !=0 || year%400==0); /* 윤년 확인 */
 if(isleep && month>2)        /* 윤년이고 2월이 넘었다면 1일 더함(29일) */
  count++;
 printf("올해의 %d 번째 날입니다. \n", count);   /* 출력 */
 return 0;
}

연구과제
/* 지정하는 다음 함수를 작성하고 이 함수의 동작을 확인하시오
 * void transpose(int s[3][3], int d[3][3];
 * 1 2 3          1 4 7
 * 4 5 6    ==>   2 5 8
 * 7 8 9          3 6 9 */

#include <stdio.h>

void transpose(int s[3][3], int d[3][3]);

int main(void)
{
 int a, b;
 int s[3][3];
 int d[3][3] = {1,2,3,4,5,6,7,8,9};
 for(a=0; a<3; a++){
  for(b=0; b<3; b++){
   printf("%d", s[a][b]);
 putchar('\n');
 }
 return 0;
}

void transpose(int s[3][3], int d[3][3])
{
 int i, j;
 
 for(i=0;i<3;i++){
  for(j=1; j<3; j++)
   s[j][i] = d[i][j];
 }
}
====

사용자 삽입 이미지
by Joe & Soohy 2007. 1. 8. 09:45