- favicon.ico Generator
- Ferry Halim
- interfaceLIFT
- 클리앙
- 쿨엔조이
- 플레이웨어즈
- 윈도우포럼
- 보드나라
- i-funbox
- firefox
- chris jordan
- 매니캠
- 웹캠
- 아이팟mp3뽑기
- star cd key
- kbs포토뱅크
- Vimeo
- 4shared
- snoopybox
- 인터넷라디오
- RaySoda
- 더어플 :: 내 손안에 작은세상
- love:paradox
- 룩포박스
- 월간잉여
- 디지의 수상한 공작소
- 일본
- SLRCLUB
- 차도녀의 싱글라이프
- Serepim의 코믹 스페이스
- Freemake
- NBA Mania
- 게티이미지뱅크
- 알바정리
- 팝코넷
- 기글하드웨어
- cj더키친
- Fantastic Typoon
- 한국관광공사
- 3uTools
- 브릭캠퍼스
- 다인의 편의점 이것저것
- foobar2000
- Wallpaper
- simplehuman
- 퀘이사존
- SoundCloud
- 예판넷
- 올파츠
- 퀘이사존
- 비플릭스
- 엔공구
- 마베르만
- 오토브라이트 다이렉트
- 토에이 온라인 스토어
- Road Trail Run
- Apple System Status
- 쿼라
- 슈프라이즈 - 스니커즈 발매정보
- 풋셀 커뮤니티
- 럭키드로우
- 통관알리미
- Tears of the Kingdom MAP
- Tears of the Kingdom MAP 2
- SWITCH WORLD
- dprime
- 데일리슬슬
- 핫썰
- 핫딜
- 번코 - 세상의 모든 자막
- 에펨코리아
- MY FREE MP3
- 영s의 브런치스토리
- 메타크리틱
- 오픈크리틱
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 섬머소닉
- 윈도우7
- 지산락페
- 율량
- V60 CC
- 티스토리초대
- 펜타포트
- 마재윤
- 밸리록
- 티스토리 초대장/ 티스토리초대
- 살라
- 스타크래프트2
- 윤종신
- 개봉기
- u2
- 키스 플린트
- 행보
- 김사랑
- 존프루시안테
- U2내한공연
- UK B-Boy Championships
- 청주
- 티스토리 초대장
- 정보처리산업기사
- 비보이
- 섬머소닉 2차
- 키스플린트
- V60 크로스커트리
- DDT4ALL
- 진중권 블로그 100분토론 디워
- Today
- Total
알고리즘
배열 본문
제 7 강 : 배열
학습목표 : 배열 데이터에 데이터를 입력하고 출력하는 기법을 배운다.
*요점정리 :
배열이란 같은형의 데이터 n개가 연속적으로 설정되어 있는 것을 의미한다.
1차원 배열은 변수끝에 [ ]을 사용하여 배열을 설정한다.
2차원 배열은 [][]을 사용하여 그안에 배열의 수를 설정한다.
7-1.배열의 형식
배 열이란 여러개의 데이터형을 한꺼번에 설정하는 것을 말합니다. 다시 말하면 여러개의 데이터가 한 묶음으로 되어있다는 말입니다. 문자데이터를 연결하여 30개를 사용하고자 할때나 정수형 데이터를 5개를 한번에 사용할 때 배열을 사용합니다. 그럼 이런 배열은 어떻게 표현 되는지 알아보겠습니다. 형식을 보면 형을 선언하고, 변수를 선언하고, 대괄호 다음에 배열개수를 선언합니다. 문자열 배열 5개를 한다고 하면 char형을 선언하고 string[5](변수명은 자기가 마음대로 쓰면 된다.)라고 표현하면 됩니다 여기서 가로안에 5라는 것은 문자를 5개 저장할 수 있다는 뜻입니다. 그렇다면 정수형 3개가 들어가는 배열이 있다 라고 한다면 어떻게 표현하면 될까요? 임의적으로 배열의 이름을 num이라고 한다면 int num[3] 이라고 표현하면 될 것입니다 float형이나 double형 등도 같은 방법으로 표현 할 수 있습니다. 그림 7-1은 배열의 형태를 도시한 것입니다.
(그림 7-1) 여러 가지 배열
그 림 7-1)에 있는 그림은 문자열 배열, 정수형 배열, 실수형 배열의 예를 보여주고 있습니다 문자열 배열 string[5]라는 것은 문자열이 5개가 있는 배열이라는 것 입이다. 문자형은 1바이트이니까 1바이트가 하나, 둘, 셋, 넷, 다섯 개 이렇게 쭉 일렬로 연결되어 있다, 라는 것입니다. 거기서 첫 번째 값에는 L, 두 번째 값에는 O, 세 번째 V, E, 마지막에 0값 이렇게 데이터가 들어갈 수 있다는 것입니다. 그 다음 int[3] 이라고 하는 것은 int형 대이타가 배열로 3개가 있다는 것입니다 그런데 그림 7-1)을 보면 문자열 하고는 모양이 틀리지요? 문자열은 1바이트이지만 정수형은 4바이트를 쓰기 때문에 4byte 짜리가 연결돼서, 3개가 연결돼서 들어가 있다라는 얘기가 되기 때문입니다. float형도 4바이트를 쓰기 때문에 정수형과 같은 모습을 하게 됩니다. 결론적으로 int num 3개라는 것은 가로로 4개, 세로로 3개니까 12개의 바이트를 소유하게 됩니다. 또 float 데이터 4개라고 하면, 이렇게 데이터가 들어가 있는 것이 하나, 둘, 셋, 네 개가 들어가 있는 것입니다. 정리하면 문자형 같은 경우에는 문자는 1byte니까 배열을 5개를 주겠다 하면 문자가 5개가 연속으로 있는 것이고, 정수형일 때의 배열은 정수형이 4byte이니까 4byte짜리가 3개가 연속적으로 있는 것이고 , float형일 경우에는 4byte이니까 4byte가 쭉 연속돼서 들어가 있다는 이야기 입니다. 그래서 정수형일 때는 3015가 4byte 안에 들어가 있고 6234라는 값이 4byte, 그 다음에 7262라는 값이 4byte 안에 이렇게 들어가 있다는 이야기 입니다. 프로그램을 하다 보면 배열을 많이 씁니다. 문자배열로 예를 들어보면 ‘안녕하세요’, ‘ABCD’, ‘LOVE’ 이런 것들은 글자들을 하나 하나들을 쭉 연결시킨 배열 형태입니다. 숫자 같은 경우도 100, 110, 120, 130 이렇게 값을 연속적으로 저장하고자 할 때에는 배열을 이용할 경우가 많습니다. 배열을 이용하고자 할 때 그 배열의 저장방식은 바로 이렇게 크기에 따라서 그 자기의 크기가 일렬로 연결되어 있는 형태입니다.
7-2.문자형배열
앞에서 문자, 정수, 실수배열을 어떤 식으로 처리해 나가는가하는 것을 배웠습니다. 이제 문자배열이 대해 좀 더 알아보도록 하겠습니다.
문자형 배열은 char라고 선언해 주고, 변수명을 선언해 주고, 배열 개수 선언해 주면 문자열 배열이 되는 것입니다. char temp[8] 이라고 한다면 문자형 8개가 일렬로 나열되어있는 배열의 이름이 temp 라는 것입니다.
8 개의 배열 중에 첫 번째 주소값은 0입니다. 그래서 temp[0]이라고 표현 됩니다. 이 첫 번째 값에 A를 놓고자 한다면 temp[0]=‘A'; 이렇게 해서 문자를 넣어 주면 됩니다. 두 번째가 1, 세 번째가 2, 네 번째가 3, 이렇게 한 값씩 지정되게 됩니다. 조심하셔야 할 것은 배열의 주소값이 1부터 시작하는 것이 아니라 0부터 시작한다는 것입니다. 문자열을 처리하는 함수들은 많습니다. 왜냐하면 우리가 문자를 많이 쓰기 때문입니다. 대표적인 함수로 strcpy라는 함수가 있는데 string copy의 약자입니다. strcpy(문자배열 변수1, 문자배열 변수2) 라고 하면 문자배열 변수2에 있는 데이터를 문자배열 변수1로 저장하겠다, 라는 말이 됩니다.
알 고 가자^^) 나중에 또 다루겠지만 문자열 배열은 다른 정수형배열이나 실수형 배열과 값을 입력하는 방법이 다릅니다 정수형 배열이나 실수형 배열은 직접 넣어주면 되지만 정수형 배열은 strcpy나 strcat 등의 문자열 함수를 이용하면 편리하게 처리할수 있습ㅈ니다. 뒤에서 다루게 되는 예제중에 이름과 전화번호를 입력받는 예제가 있는데 전화번호는 정수이기 때문에 바로 변수를 입력받아서 배열에 입력할 수가 있습니다 그러나 이름의 경우에는 strcpy를 써서 입력하는 방법을 사용했습니다.. 많은 분들이 그것을 잊어버리시고 헤메는 것을 볼 수 있는데 여러분들은 꼭 기억하시기 바랍니다. 무슨 소리인지 모르시겠다고요? 그럼 일단 넘어가세요. 같이 공부하시다보면 “아 이 소리였군” 하시게 될 것입니다.
문 자열 배열에는 다른 형의 배열에는 없는 것이 있는데 문자열 배열 마지막에는 꼭 “null" 값이 들어간다는 것입니다. ”null"이라는 값은 코드값으로 0에 해당됩니다. 예를 들어서 “test”라는 문자가 들어있는 문자형 배열이 있다고 하면 ‘t’ ‘e’ ‘x’ ‘t’라는 4개의 문자가 들어가고 마지막에는 숫자 ‘0’ 값이 들어간다는 것입니다 보통 0을 null이라고 하는데, 0값, 아무것도 없다, 라는 뜻입니다. 문자열 배열은 일반적으로 문자열이 끝나는 지점에 0값이 집어넣어진 것까지 포함시킨 것이 바로 문자열 배열이라고 합니다. 이 ‘null'값은 한 분장이 끝났다라는 것을 알려주는 역할을 하게 됩니다. 그림 7-1에서 LOVE 다음에 숫자 0이 설정된것도 바로 이런 예입니다.
문 자열 배열을 출력할 때는 printf 함수로 %s 기호를 이용해서 출력할 수가 있습니다. printf 함수를 이용하여 문자열을 출력할때는 printf("%s", 출력하고자하는 문자형 배열) 과 같은 형식을 사용하게 됩니다. 다른 방법으로 큰 타옴표를 이용하는 방법이 있는데 printf("출력하고자 하는 내용\n")라고 코딩을 하면 큰따옴표 안에 있는 내용을 그대로 화면에 출력하게 됩니다. 큰따옴표 안에 있는 ‘\n'의 의미는 한줄이 끝났다라는 것을 알려주는 것입니다 그럼 이젠 한 단계 더 발전된 형태로 화면에 출력해볼까요? 예를 들어 printf("이것은 %s 입니다.“, ”테스트“); 라고 코딩을 한다면 어떻게 화면애 출력될까요? 화면에는 ”이것은 테스트 입니다.“ 라고 출력될 것입니다 %s는 문자형 배열을 듯한다면 앞에서 말슴드렸지요? 그러면 여기서는 문자형 배열 테스트가 %s 대신에 출력되게 됩니다.
C 언어에서는 문자를 출력하는 기능들을 많이 사용하고 있기 때문에 문자형 배열에 대한 함수들이 많이 있습니다. 그 함수들을 string함수라 하는데 물론 나중에 가서 string함수에 대한 것들을 많이 배우겠지만, 중요한 것은 문자형 printf함수도 문자열을 출력하라는 함수다, 라는 것을 기억하시면 됩니다.
다음의 두 예제는 문자형 배열에 “Love is"라는 문자열을 입력하는 프로그램입니다.
예제 1)문자를 직접 할당해서 출력 하는 예
#include <stdio.h>
void main()
{
char string[8];
string[0]='L';
string[1]='o';
string[2]='v';
string[3]='e';
string[4]=' ';
string[5]='i';
string[6]='s';
string[7]=0;
printf("%s\n", string);
}
결과)
예제2)문자열 함수를 이용한 예
#include <stdio.h>
#include <string.h>
void main()
{
char string[8];
strcpy(string, "Love is");
printf("%s\n", string);
}
결과)
첫 번째 예제는 string문자열에 문자를 하나씩 넣어주는 프로그램입니다. string이란 이름의 8개의 문자형 공간을 가지는 문자형배열을 만든 다음 첫 번째부터 L, o, v, e, 공백(스페이스, 32번이라고도 하는데 빈칸을 말함), i, s하고 마지막에 0 까지 8개의 문자를 하나씩 넣어 줍니다. 여기서 0은 맨 마지막에 문자열 끝에 항상 0번을 넣는다고 했죠? 이렇게 해서 printf함수를 써서 화면에 출력하면 "Love is" 라는 문자가 출력되게 됩니다. 2번째 예제는 strcpy라는 함수를 사용해서 문자열을 입력하는 프로그램입니다. 여기서 주목해야 하는 것은 프로그램 처음에 #include <string.h>를 꼭 집어넣어 주어야 한다는 것입니다 이 #include 부분은 나중에 뒤에 가서 다시 설명하도록 하겠습니다. 문자열 8개 해주고, 그 다음에 strcpy(string, "Love is"); 이렇게 코딩하시면 “Love is” 라는 문자열이 string으로 들어가게 됩니다. 이 방법은 첫 번째 방식과 결과는 같지만 더 간결하게 프로그램을 만들 수 있습니다.
만 약 Love is 다음에 뒤에 더 많은 글자들을 집어넣게 되면 어떤 문제가 발생될까요? 배열은 8개 밖에 없는데, 8개 이상으로 데이터를 집어넣게 되면 error가 납니다. 글자를 8개 이상 넣고 싶다면 원하는 만큼 배열을 미리 늘려 놓아야 한다, 라는 것입니다. 배열을 선언하게 된다는 건 미리 내가 어느 정도의 크기의 데이터를 가지고 쓰겠다, 라는 것을 미리 설정하는 의미가 됩니다.
scanf 함수를 이용해서 문자열을 입력 받을수 있습니다. 다음 예는 scanf 함수를 이용해서 string[20]개의 배열에 문자를 입력받는 예입니다.
예)scanf("%s",string);
scanf 함수로 입력을 받게 되면 공백 문자가 나올때까지만 string에 입력됩니다. 예를 들어서 “Love is" 라고 입력을 하였을 경우 Love 와 is 사이에 공백이 있기 때문에 string안에는 "Love" 만 들어오게 됩니다. 예제3)은 scanf 함수를 이용한 문자열 입력 예입니다.
예제3)scanf 함수를 이용한 문자열 입력 예
#include <stdio.h>
#include <string.h>
void main()
{
char string[50];
printf("문자열을 입력 받습니다.\n");
scanf("%s", string);
printf("입력한 문자열은\n");
printf("%s\n", string);
}
결과)
예제3) 문자를 입력받는 예제인데, scanf함수에도 마찬가지로 %s로 문자를 입력받을 수 있습니다. string의 배열로 50개를 잡고 문자를 입력하게 되면 string(scanf("%s", string);) 에 들어가게 됩니다. 입력한 문자열이 저장된 string을 다시 출력하면 “안녕하세요”가 출력되게 됩니다. scanf에서 %s로 문자를 입력 받으면 공백이 나오기 전까지 문자열을 받습니다. 여기서 주의 하실게 있는데 영어는 한글자가 1바이트이지만 한글은 한글자가 2바이트라는 것입니다 입력을 할때 “안녕하세요”라고 한글을 입력했기 때문에 한글자당 2바이트를 차지해서 “안녕하세요”가 차지하는 배열은 11개가 됩니다 (문자열을 마지막에 무조건 'null'이 한바이트 차지한다는 것을 잊지마세요)
배 열은 '&'기호를 사용하지 않습니다. 지금까지 단일 문자형 데이터일 경우 scanf함수를 이용한다고 할 경우 '&'을 사용하였습니다. 배열은 단일형이 아니라 하나의 포인터 개념이기 때문에 사용하지 않는다고 말씀드릴수 있습니다. 이부분에 대한 내용도 뒤에 자세히 설명하겠습니다.
공백을 포함한 문자를 모두 받고자 한다면 gets함수를 사용하면 됩니다. 예를 들어서 string[20]에 문gets를 사용하여 문자열을 받고자 한다면 다음 예와 같이 쓸수 있습니다.
예)gets(string);
gets 함수의 인수에는 문자열 배열이나 문자열 포인터 변수를 설정할수 있습니다. 설정된 인수로 명령 프롬포트에서 Enter 키가 눌리기 전까지의 문자열을 string에 저장합니다.
예제 4)는 gets함수를 이용한 문자열 입력 예제 입니다.
예제 4)문자열 입력 예제
#include <stdio.h>
#include <string.h>
void main()
{
char string[80];
printf("입력할 문자열\n");
gets(string);
printf("%s\n",string);
}
결과)
예제 4)는 string 문자 배열을 설정하고 gets함수를 이용하여 문자열을 입력 받은 예입니다. 출력 결과를 보면 알수 있듯이 공백을 포함한 모든 문자열이 string에 저장됩니다.
7-3.정수형 배열
정 수형 배열은 int 변수[배열개수]와 같은 방법으로 표현합니다. 예를 들어 int data[8]이라고 한다면 8개의 정수를 넣을 수 있다는 말이 되고 data[0] = 3625 라고 한다면 배열의 첫 번째 자리에 3625 라는 값을 넣어 준다는 말입니다.
정 수형 배열에 정수를 넣을 때는 4byte의 int의 배열이나 long의 배열을 사용합니다. 정수형 배열은 문자열 배열처럼 strcpy와 같은 함수가 없고 scanf함수를 이용할 때 %s 기호로 한 번에 입력받을 수 없습니다. 그것은 정수가 4byte 단위로 들어가고 또 따로따로 입력받는 것이 사용할 때 정확하기 때문입니다. 물론 나중에 배우시게 될 포인터를 이용해서 한번에 지정하는 방법이 있기는 합니다. 그래서 정수형 데이타는 입력 받을 때와 마찬가지로 출력하고자 할 경우에도 따로따로 해서 %d를 이용해서 출력합니다. 부호가 없는 정수형일 때 앞에 unsigned %u를 해주고, 뒤에 []안에 숫자를 써주면 됩니다.
다음에는 이런 배열을 가지고, 정수형 배열과 소수형 배열들이 예제를 어떻게 작성 한 번 해보면서 데이터를 넣고, 빼는 방법들을 알아보도록 하겠습니다.
예제5)정수형 배열 예제
#include <stdio.h>
void main()
{
int data[5];
int i;
printf("5개의 수를 입력받습니다.\n“);
for(i=0; i<5; i++)
scanf("%d", &data[i]);
printf("입력한 수를 씁니다.\n");
for(i=0; i<5; i++)
printf("%d,", data[i]);
printf("\n“);
}
결과)
이 예제는 먼저 5개의 정수를 입력받고 입력받은 정수를 다시 화면에 출력하는 프로그램입니다. 여기서는 for문을 이용하여 5개의 정수를 5번을 반복하여 하나씩 입력을 받고 다시 for문을 이용하여 5개의 정수를 출력하는 예제입니다. scanf함수를 이용하여 데이터를 받아다가 반복번호에 해당되는 data[i]에 해당하는 값을 입력하게 되는데, 배열 첫 번째 주소는 0 이므로 첫 번째 데이터는 0번째에 이 들어가고 두 번째는 1에 들어가는 방식으로 하나씩 메모리를 차지하게 되는 것입니다 출력하는 것도 마찬가지로 printf 함수를 이용하여 정수를 하나씩 for문의 반복에 의해 출력하게 되는데, 이런 식으로 데이터를 입력받을 수가 있고, 그리고 출력할 수 있게 됩니다. 또 하나 중요한 것은 int data라는 배열을 놓고 원하는 배열 순서에 데이터 값을 놓고 싶다고 할 경우에는 data[2]=365처럼 직접 원하는 배열 번호에 값을 입력할 수 있습니다. 일단 이런 데이터들을 우리가 입력하고 난 다음에 산술연산을 하게 됩니다.
예제6).실수형 배열 예제
#include <stdio.h>
void main()
{
float data[7], total;
int i;
printf("소수 7개를 입력 받습니다.\n");
for(i=0; i<7; i++)
scanf("%f", &data[i]);
total = 0;
for(i=0; i<7; i++)
total = total + data[i];
printf("총계 %f", total);
}
결과)
실 수형 배열 예제도 정수형 예제와 같습니다. 다만 형식을 쓸 때 float로만 썼다는 것입니다. 데이터 7개를 받고, total이라는 것을 하나 넣었습니다. 그래서 이렇게 데이터 값을 7개를 받은 다음에 total=0 해주고 total을 이용해서 계속적으로 받은 값들을 반복(for문)시켜서 더한 합계를 내는 프로그램입니다. 여기서 결과를 보시면 화면에 총계가 353.200012 라고 나왔는데 밑줄 친 부분의 값이 외 나왔을가요? 이렇게 되는 이유가 무엇인가 하면, 데이터 값들을 초기화하지 않아서입니다. 원래 float를 쓸 때는 data[0]=0이렇게 초기화를 해줘야 합니다. 물론 초기화하지 않아도 값은 비슷하게 나옵니다. 그렇지만 float는 4바이트 중에서 지수부하고 가수부로 나뉘어 지면서 안 쓰는 데이터들이 쓰레기 값이 들어가는 문제점이 있습니다. 그래서 초기화 해주는 버릇도 들이셔야 합니다. 아래와 같이 초기화부분을 삽입하여 주시면 값이 깨끗하게 나오는 것을 확인 하실 수 있으실 것입니다.
for(i=0;i<7;i++)
{
data[i]=0 //이렇게 해주면 초기화되고 그 다음에 들어간다. 이렇게 하면 그 뒤로 값이
깨끗하게 나올 것이다.
scanf("%f", &data[i]);
}
7-4.Select Sort
이 제 배열을 배웠으니까 배열을 이용한 하나의 알고리즘을 이용해 보도록 하겠습니다. 배열을 사용하여 데이터를 설정하였을 경우 가장 흔하게 이용하는 것이 배열의 데이터를 정렬하는 방법입니다. 이런 정렬 방법에는 Select Sort, Quict Sort, Bubble Sort 등이 있습니다. 그중에서 가장 간단한 방법으로 정렬하는 방식이 Select Sort 라고 하고 합니다. 보통 선택정렬이라고 하기도 합니다. 그림 7-2는 Select Sort 의 알고리즘을 그림으로 표현한것입니다.
(그림 7-2)선택정렬
데 이터들이 그림7-2)에서 처럼 3 6 8 4 2가 0번부터 차례로 들어가 있는데 이것을 나중에 2 3 4 6 8로 정렬을 해주고 싶다는 것입니다. 정렬을 하는 방식은 먼저 첫 번째 다섯 번을 반복하면서, 가장 작은 값을 찾습니다. 가장 작은 값을 찾은 다음에 그 값을 맨 위로 올려줍니다. 그러면서 맨 위에 있던 값 3은 가장 작은 값이 있던 자리로 보내집니다. 이제 맨 위에는 데이터는 빼고 다음 부분부터 시작해서 가장 작은 값을 찾고 그 중에서 가장 작은 값은 2번째 배열로 올립니다. 이런 방식으로 하다가 보면 정렬이 되는 것을 보실 수 있을 것입니다 이런 식으로 반복해서 정렬하는 방식이 Select Sort방법인데, 이 방법은 총계산량은 n(n-1)/2 정도가 됩니다. 이런 방식은 연산량이 굉장히 많은 편에 속합니다. 이 외에 여섯 가지 정도가 있는데 Select Sort말고 버블 소트, 쉘 소트, 퀵 소트.. 버블 소트등이 있습니다. 예제 7은 Select Sort를 사용한 예입니다.
예제7).Select Sort 예제
#include <stdio.h>
void main()
{
int i, num, j, tem;
int data[5];
for(i=0; i<5;i++)
scanf("%d",&data[i]);
for(i=0; i<5; i++)
{
num = i;
for(j=i; j<5; j++)
{
if(data[j]<data[num])
num = j;
}
tem = data[i];
data[i] = data[num];
data[num] = tem;
}
for(i=0; i<5; i++)
printf("%d",data[i]);
printf("\n");
}
결과)
아까 말한 Select Sort의 예제입니다. 프로그램을 보면 for(i=0;i<5;i++) 에 의해서 점점 비교해야 하는 수가 줄어듭니다. 준다는 것이 반복이 줄지만 시작점에 처음에는 0으로 들어갔다가 그 다음엔 1로 들어가고, 2로 들어가고, 3으로 들어가고, 4가 들어가는 방식으로 진행 되어 나갑니다. 결국 여기 i값부터 시작되는 것인데, 처음에는 0으로 들어가는 것으로 해서 i값이 초기 값으로 들어갑니다. 이렇게 5번 반복해서 반복을 해서 데이터 j값이 (j값이라 함은 검색해서 첫 번째 값이 된다.) 데이터 num(첫 번째 값들) 값보다 작으면 이것이 최소 값이 되는 것입니다. 여기서부터 최소 값이 작아지는 것인데 최소 값의 번호를 잡은 다음에 이 반복을 종료하고 temp라는 곳에 data i값을 넣습니다. data I값이라는 것은 5, 4, 3, 2, 1인 것들 입니다. 첫 번째 값은 0이 되고, 그 다음엔 1값이 되고, 그 다음엔 2값이 되는 형식으로 데이터 i값을 채워가는 것입니다. 이렇게 채어들어 가는 값들을 temp에 저장을 하고, 최소 값에 있는 값을 바로 data[i] 고 위치에 집어넣고, 그 다음에 원래자리에다가 temp값을 다시 집어넣는 것이지요. 그러니까 이 자리에 있었던 것을 최소 값이 있는 자리로 집어넣으면서 반복을 하게 되면 sorting이 됩니다.
7-5. 2차원 배열
2차원 배열 역시 다차원 배열에 속하는 것이지만 보통 많이 쓰는 것이 2차원 배열이기 때문에 2차원 배열만 먼저 설명하겠습니다.
char data[5][5]를 그림으로 표현하면 그림 7-14와 같은식으로 표현 할 수 있습니다.
그림 7-3)2차원 배열
이 차원배열은 데이터형 변수명 [변수][변수] 와 같은 방식으로 표현되는데 앞에 있는 가로의 수가 세로열의 수를 표시하고 뒤에 있는 가로의 변수가 가로열의 수를 표시합니다. 예를 들면 char data[4][20] 이라고 했을 때 20바이트짜리 char형 배열 4개가 있다는 뜻이 됩니다. 이 이차원배열에 데이터를 넣어보면 첫 번째 배열에는 ‘태권V’, 2번째 배열에는 ‘지구천왕’, 세 번째 배열에는 가오가이거, 네번째 배열에는 ‘디지몬’ 식으로 입력할 수 있습니다 정수와 소수의 2차원 배열은 행렬 데이터를 정렬시키거나 계산할 때 굉장히 유리한 방법입니다.
예제8). 2차원 배열 예제
#include <stdio.h>
void main()
{
char name[5][20];
int i;
printf("이름5개를 입력하세요\n");
for(i=0; i<5; i++) {
scanf("%s", name[i]);
printf("출력 합니다.\n");
}
for(i=0; i<5; i++){
printf("%s",name[i]);
}
}
결과)
이 름을 입력 할 때 “만득이, 천득이, 백득이, 십득이, 일득이” 5개를 입력해서 입력한데로 출력하는 예제입니다. 일반적으로 문자열 2차원 배열은 1차원 문자열 배열로 보시는 것도 좋습니다. char name[5][20]이라고 설정하였다면 20개의 문자열을 가질수 있는 5개의 배열로 생각한다는 것입니다. 이렇게 보면 name[0]이라고 선언하게 되면 name[0]은 20개의 문자열을 가질수 있는 변수가 됩니다.
정수형이나 실수형 2차원 배열은 각각의 배열을 하나하나 사용해야 합니다. 예제9)는 2차원 소수 배열의 각 가로열의 평균을 구하는 예입니다.
예 9)실수형 2차원 배열
#include <stdio.h>
void main()
{
float data[5][4],sum[5];
int i,j;
printf("실수 4개의 값을 5번 입력하세요\n");
for(i=0;i<5;i++)
{
sum[i]=0;
for(j=0;j<4;j++)
{
scanf("%f",&data[i][j]);
sum[i]+=data[i][j];
}
}
printf("각 항의 총합은 \n");
for(i=0;i<5;i++)
printf("%f\n",sum[i]);
}
결과)
2 중 for 반복문에서 총 20개의 실수형 데이터를 받습니다. 이때 Enter키는 상관이 없습니다. 결과 그림에서 보듯이 5개씩 입력을 했다 하더라도 처음 4개만 data[0]의 4개항목에 입력이 됩니다. 이렇게 입력된 데이터를 1차원 실수 배열 sum[5]에 총 합을 출력합니다.
12.다차원 배열
다 차원 배열은 3차원 배열 이상을 말하는 배열입니다. 에를 들어 char data[3][4][10]; 이라고 한다면 문자열 10개를 쓸 수 있는 것이 4개가 있는데, 그 4개 짜리가 3개가 있다, 라는 말입니다. 2차원배열, 3차원배열 하면 어렵게 생각 하시는 분들이 있는데 우리가 어린 시절에 받았던 종합선물 세트를 생각하시면 이해하시기 쉽습니다. 종합선물 세트가 3개 있다고 하고 안에는 껌이 한 3통 정도 들어있습니다 그리고 그 껌한통에는 껌이 한 5개 정도 들어 있습니다. 이것이 3차원 배열입니다 만약 4차원 배열이라고 한다면 이 종합선물 세트가 들어있는 박스가 3개 정도 있다고 생각하시면 됩니다 이 4차원배열을 표현식으로 표현해 보면, “과자(데이타형) 종합선물세트(배열명) [3](박스가 3개)[3](종합선물세트 3개)[3](껌이 3통)[5](껌이 5개) 와 같은 방식으로 표현 됩니다
다차원 배열들을 갈 때 너무 많은 다차원 배열을 쓰는 것이 좋다고는 볼 수 없습니다. 왜냐하면, 데이터들을 처리할 때 자기 자신도 많이 헷갈리고 프로그램에서의 퍼포먼스도 많이 떨어집니다.
다 차원배열은 이런 것들이 있지만 일반적으로 정수형 데이터나, 소수형 데이터, 숫자형 데이터는 2차원까지 쓰는 것이 좋고, 문자 데이터는 3차원까지 쓰는 것이 좋습니다. 이 부분에 대해서는 나중에 포인터로 가면서 더욱 자세하게 설명하게 될 것입니다
'study > programming' 카테고리의 다른 글
배열 오름차순 (0) | 2007.11.21 |
---|---|
배열 오름차순 (0) | 2007.11.13 |
c (0) | 2007.11.13 |
c (0) | 2007.11.12 |
07.11.04 정보처리산업기사 합격수기 (0) | 2007.11.11 |