2010-1 학기프로그래밍입문 (1) chapter 06-1 참고자료 배열 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1-
배열의선언과사용 같은형태의자료형이많이필요할때배열을사용하면효과적이다. 배열의선언 배열의사용 배열과반복문 배열의초기화 유연성있게배열다루기 한빛미디어 -2-
배열의선언 배열은배열명과변수의개수, 변수의자료형으로선언한다. 배열을선언하면변수의개수만큼연속된기억공간을할당한다. 한빛미디어 -3-
배열의사용 배열의기억공간을사용할때는각기억공간이배열에서차지하는위치를사용한다. 배열을구성하는기억공간들을배열의요소 (element) 라고하며각요소가배열에서차지하는위치를첨자 (index) 라고한다. 배열의첨자는 0 부터시작한다. 한빛미디어 -4-
배열의사용 ages 배열의세번째배열요소에데이터를저장하고출력할때 int ages[5]; ages[2] = 20; // 배열의선언, 배열요소의개수는 5개 // 세번째배열요소에 20을저장 printf( 세번째배열요소에저장된값은 : %d n, ages[2]); // 저장된값을출력 배열요소에값을입력받을때도일반변수와같이사용한다. 첨자는 0부터시작하므로배열요소의개수가 5개이면 5를첨자로사용할수없다. 한빛미디어 -5-
배열과반복문 배열요소는첨자로구분되므로반복문을사용하면모든배열요소를간단하게참조할수있다. - ages 배열의모든요소에값을입력받는경우 i 제어변수를배열요소의첨자로사용한다. 한빛미디어 -6-
배열을사용하여평균나이를계산하는프로그램 #include <stdio.h> int main() { int ages[5]; int tot=0; double avg; int i; } printf(" 다섯명의나이를입력하세요 : "); for(i=0; i<5; i++){ // i가 0부터 4까지변하면서다섯번반복한다. scanf("%d", &ages[i]); // 각배열요소에나이입력 } for(i=0; i<5; i++){ tot+=ages[i]; } avg = tot / 5.0; printf(" 입력된다섯명의나이 : "); for(i=0; i<5; i++){ printf("%d ", ages[i]); } printf(" n 다섯명의평균나이는 %.1lf 입니다. n", avg); return 0; // 다섯명의나이를저장할배열 // 총합을저장할변수, 미리 0 으로초기화한다. // 평균나이를저장할변수 // 반복제어변수 // 모든배열요소의값을누적시킨다. // 평균나이계산 // 각배열요소의값을출력 // 평균나이출력 한빛미디어 -7-
배열의초기화 배열을선언하면처음에쓰레기값이존재한다. int nums[5]; int i, tot=0; for(i=0; i<5; i++){ tot+=nums[i]; } printf( total : %d n, tot); // 쓰레기값의합이출력된다. 배열은기억공간의수가많으므로중괄호를사용하여초기값을나열한다. 한빛미디어 -8-
배열의초기화의자동기능 배열요소의수보다초기화값이적으면남는기억공간은 0 으로 채워진다. int nums[5] = {1, 3}; 배열을선언할때초기화하면배열요소의개수를생략할수있다. 한빛미디어 -9-
유연성있게배열다루기 배열요소의개수가자동으로계산되도록프로그램을작성하면배열의크기가바뀌어도프로그램을수정할필요가없다. 배열요소의개수를계산하여배열의합을계산하는예 int nums[]={1,2,3,4,5}; int tot=0, i; int size; size=sizeof(nums)/sizeof(nums[0]); for(i=0; i<size; i++){ tot+=nums[i]; } // 배열의초기화 // 누적변수와반복제어변수 // 배열요소의개수를저장할변수 // 배열요소의개수계산 // 계산한배열요소의개수를반복문에사용한다. 한빛미디어 -10-
문자열을저장하는문자배열 문자배열은문자열을저장하는하나의변수와같은역할을한다. 문자배열의선언과사용 문자열은널문자가완성한다! scanf함수를사용한문자열의입력 문자배열의초기화 한빛미디어 -11-
문자배열의선언과사용 문자배열은기본적으로여러개의문자를저장하기위한 char형배열이다. - 4 개의문자를저장할수있는문자배열의선언 배열요소에문자를저장하면문자열이만들어진다. 한빛미디어 -12-
문자열은널문자가완성한다! 문자배열의마지막에널문자 ( 0 ) 가없으면저장된문자열의끝을알수없다. - printf 함수로출력하는경우쓰레기값이출력된다. char word[50]; word[0]= L ; word[1]= o ; word[2]= v ; word[3]= e ; printf( %s, word); // 넉넉한배열선언 // 문자를하나씩입력하여문자열완성 // 문자열출력 Love 儆儆儆儆儆儆儆儆儆儆儆儆儆儆儆儆儆 한빛미디어 -13-
문자열은널문자가완성한다! 문자배열에문자열을저장할때는항상마지막에끝을표시하는널문자 ( 0 ) 를넣어줘야한다. char word[50]; word[0]= L ; word[1]= o ; word[2]= v ; word[3]= e ; word[4]= 0 ; printf( %s, word); // 문자열의끝을널문자로표시해준다. Love 한빛미디어 -14-
scanf 함수를사용한문자열의입력 문자배열에문자열을입력받을때는 %s 변환문자열과배열명을 scanf 함수의전달인자로준다. scanf 함수로문자열을입력받으면널문자를자동으로채워준다. - word 배열에 vitamin 을입력받은경우 printf( 문자열을입력하세요 : ); scanf( %s, word); 문자열을입력하세요 : vitamin ( 엔터 ) 한빛미디어 -15-
scanf 함수로문자열을입력할때주의할점 배열의크기보다입력되는문자열의크기가더크면할당되지않은기억공간을침범하므로주의해야한다. char word[5]; // 이곳에 vitamin 을입력받는다면 한빛미디어 -16-
문자배열의초기화 문자배열은기본적으로문자상수들로초기화한다. char str[10] = { d, r, e, a, m, 0 }; 초기화하고남는배열요소는 0으로채워진다. - char형배열요소에 0이저장되면널문자가되므로결국남는배열요소는널문자로채워지는것이다. 문자배열은문자열상수로직접초기화가가능하다. 단, 선언과동시에초기화하는경우만가능하다. char str[80] = dream ; str = utopia ; // 배열선언과동시에초기화 ( ) // 배열에문자열을바로대입할수없다. ( ) 한빛미디어 -17-