글
제 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];
}
}
====