C 프로그래밍및실습 7. 배열 세종대학교 목차 1) 배열이란? 2) 배열초기화 3) 배열응용 4) 실수배열과문자배열 5) 다차원배열 2
1) 배열이란? 변수를여러개만들어야하는상황을생각해보자. 사용자로부터 5개의정수를입력받아변수에저장하고, 이값을출력하는프로그램은다음과같이작성할수있다. 하지만, 정수가 100개라면? 배열을사용하여해결 int x0, x1, x2, x3, x4; scanf("%d%d%d%d%d", &x0, &x1, &x2, &x3, &x4); printf("%d %d %d %d %d\n", x0, x1, x2, x3, x4); 3 1) 배열이란? 배열이란? 같은자료형의변수여러개를하나로묶은자료형 배열을이용하여많은변수를한번에선언하고, 저장된데이터를처리할수있음 앞예에서사용한 5개의변수를배열형식으로표현하면 x0, x1, x2, x3, x4 x[0], x[1], x[2], x[3], x[4] 배열 x x[0] x[1] x[2] x[3] x[4] 4
1) 배열이란? 배열의선언 변수이름뒤에필요한변수의개수를명시 배열선언구문자료형변수명 [ 배열크기 ]; 배열선언예 ) int x[5]; int a, b, x[10]; // 일반변수 a, b 와함께선언도가능 int x[5];... 배열선언의예 - 정수형배열, 배열의이름 x, 배열의크기는 5-5개의정수를저장하는배열 x x[0] x[1] x[2] x[3] x[4] 배열 x 5 1) 배열이란? 배열의사용 배열의원소 (or 요소 ): 배열을구성하는각변수를지칭 배열의원소는대괄호 [ ] 안에번호를넣어서구분 x[0], x[1], x[2], x[3], x[4] 배열의첨자 or 인덱스 (index) 대괄호 [ ] 안의번호로배열에서각원소의위치를나타냄 배열의인덱스는항상 0부터시작함 예 ) 크기가 5인배열의인덱스는 0~4까지임 x[0] x[1] x[2] x[3] x[4] 배열 x 6
1) 배열이란? 앞서본예제프로그램을배열을이용하여작성해보자. 사용자로부터 5개의정수를입력받아변수에저장하고, 이값을출력하는프로그램 int x[5]; scanf("%d%d%d%d%d", &x[0], &x[1], &x[2], &x[3], &x[4]); printf("%d %d %d %d %d\n",x[0],x[1],x[2],x[3],x[4]); x[4] 를하나의변수처럼사용 scanf 에서변수앞에 & 붙여줌 [ 실행예시 ] 3 5 1 3 4 3 5 1 3 4 7 1) 배열이란? 앞프로그램에서입력되는정수가 100개라면? 배열을사용해서변수선언은간단히해결됨 하지만, 입출력부분은? 반복문을이용하여해결 배열과반복문과의만남 배열원소의인덱스가 0부터시작하여 1씩증가한다는규칙을이용하여배열의원소에접근 printf("%d ", x[0]); printf("%d ", x[1]); printf("%d ", x[2]); printf("%d ", x[3]); printf("%d ", x[4]); for( i=0 ; i<5 ; i++ ) printf("%d ", x[i]); 8
1) 배열이란? 배열을이용하여작성된최종프로그램 사용자로부터 5개의정수를입력받아변수에저장하고, 이값을출력하는프로그램 int x[5], i; for( i=0 ; i<5 ; i++ ) scanf("%d", &x[i]); for( i=0 ; i<5 ; i++ ) printf("%d ", x[i]); printf("\n"); 9 1) 배열이란? ( 실습 1, 실습 2) [ 실습1] 크기가 7인배열 x에아래점수를저장하시오. 80, 71, 91, 95, 77, 79, 88 for 문을이용하여 80점이상의학생의인덱스와점수를모두출력하는프로그램을작성하시오. 출력예시 0 80 2 91 3 95 6 88 [ 실습2] 크기가 9인배열 x를선언하시오. 구구단 3단의계산값을배열에저장한후 배열내용을화면에출력하시오. 3 6 9... 27 출력예시 10
2) 배열초기화 배열전체를초기화하는방법 배열을선언할때만중괄호 { 를이용하여배열전체를초기화하는것이가능하다. int i=0, x[5] = {0, 1, 2, 3, 4 ; for(i=0;i<5;i++) { printf("%d ", x[i]); [ 실행결과 ] 0 1 2 3 4 11 2) 배열초기화 초기값의개수가배열의크기보다작으면, 배열의뒷부분은 0 으로채워진다. int i=0, x[5] = {0, 1, 2 ; for(i=0;i<5;i++) { printf("%d ", x[i]); [ 실행결과 ] 0 1 2 0 0 12
2) 배열초기화 만약모두 0 으로초기화하고싶다면 int i=0, x[5] = {0 ; for(i=0;i<5;i++) { printf("%d ", x[i]); [ 실행결과 ] 0 0 0 0 0 13 2) 배열초기화 배열의크기를지정하지않으면? 초기화에사용된원소수에의해배열크기가결정된다 sizeof( ) 연산자는괄호안의변수혹은데이터타입의바이트수를알려준다 int i=0, x[ ] = {0, 1, 2, 3, 4 ; for(i=0;i<5;i++) { printf("%d ", x[i]); printf("\n 배열의크기 = %d \n", sizeof(x)/sizeof(int)); [ 실행결과 ] 0 1 2 3 4 배열의크기 = 5 14
2) 배열초기화 다음의출력결과는무엇인가요? int x[]={10, 5, 4, 3, 20; printf("%d %d n", x[2], x[4]); 15 3) 배열응용 ( 예제 ) 크기가 5인정수형배열을선언하고 배열의원소를순서대로 10, 20, 30, 40, 50으로초기화하시오. 원소를순서대로출력하시오. 방법 1: 쉬운방법 int x[]={10, 20, 30, 40, 50; printf("%d %d %d %d %d n", x[0], x[1], x[2], x[3], x[4]); 방법2: 반복문이용 int x[]={10, 20, 30, 40, 50; for(i=0; i<5; i++) printf("%d ", x[i]); 16
3) 배열응용 ( 예제 : 배열원소의합 ) 크기가 5 인정수형배열을선언하고 배열의원소를순서대로 3, 4, 5, 1, 3 으로초기화하시오. int x[5]={3, 4, 5, 1, 3; 배열의원소의합을구하시오. 방법 1: 쉬운방법 int x[5]={3, 4, 5, 1, 3; int sum=0; sum=x[0]+x[1]+x[2]+x[3]+x[4]; 방법 2: 반복문이용 int x[5]={3, 4, 5, 1, 3; int i=0, sum=0; for(i=0; i<5; i++) sum = sum + x[i]; 17 3) 배열응용 ( 예제 : 배열원소의평균 ) 크기가 5 인배열을선언하고 0 으로초기화하시오. 사용자로부터정수 5 개를입력받으시오. 방법 1: 쉬운방법 int x[5]={0; scanf("%d%d%d%d%d", &x[0], &x[1], &x[2], &x[3], &x[4]); 방법 2: 반복문이용 int i=0, x[5]={0; for(i=0; i<5; i++) scanf("%d", & x[i]); 반복문을이용하면사용자로부터요구사항이변경될경우에쉽게대응할수있다. 18
3) 배열응용 ( 예제 : 배열원소의평균 ) 사용자로부터정수 5개를입력받아합과평균구하기전체코드 int i=0, sum=0, x[5]={0; printf(" 정수 5개를입력하세요. "); for(i=0;i<5;i++) scanf("%d", &x[i]); for(i=0;i<5;i++) sum+=x[i]; printf("%d %f \n", sum, sum/5.0); [ 실행결과 ] 정수 5개를입력하세요. 3 4 5 1 3 16 3.200000 19 3) 배열응용 ( 실습 3) 크기가 10인배열을선언하고 0으로초기화하시오. 사용자로부터정수 10개를입력받으시오. 10개의정수중에서짝수는짝수끼리더하고홀수는홀수끼리더한후에각각합을출력하시오. 입력예시 1 출력예시 1 1 2 3 4 5 6 7 8 9 10 30 25 입력예시 2 출력예시 2 2 4 6 8 10 12 14 16 18 20 110 0 20
4) 실수배열과문자배열 실수변수를여러개만들어야할때배열을사용함 배열은여러개의변수가동일한이름을가지며, 구분은인덱스로함 실수라해서특별히달라지는점은없음 실수배열선언 double x[5]; 크기가 5 인실수배열선언 21 4) 실수배열과문자배열 초기화 (1) double x[5]={1.0, 2.0, 3.0, 4.0, 5.0; int i=0; for(i=0;i<5;i++) printf("%.1f ", x[i]); printf("\n"); [ 실행결과 ] 1.0 2.0 3.0 4.0 5.0 22
4) 실수배열과문자배열 초기화 (2) double x[]={1.0, 2.0, 3.0, 4.0, 5.0; int i=0; for(i=0;i<5;i++) printf("%.1f ", x[i]); printf("\n"); 23 4) 실수배열과문자배열 초기화 (3) double x[5]={1.0, 2.0, 3.0; int i=0; for(i=0;i<5;i++) printf("%.1f ", x[i]); printf("\n"); [ 실행결과 ] 1.0 2.0 3.0 0.0 0.0 24
4) 실수배열과문자배열 초기화 (4) double x[5]={0.0; int i=0; for(i=0;i<5;i++) printf("%.1f ", x[i]); printf("\n"); [ 실행결과 ] 0.0 0.0 0.0 0.0 0.0 25 4) 실수배열과문자배열 실수 5 개를사용자에게서입력받고합과평균을출력하시오. double x[5]={0.0, sum=0.0; int i=0; printf(" 실수 5 개를입력하세요. ); for(i=0;i<5;i++) scanf("%lf", &x[i]); for(i=0;i<5;i++) sum=sum+x[i]; printf(" 합 = %f, 평균 = %f \n", sum, sum/5); [ 실행결과 ] 실수 5 개를입력하세요. 1.0 2.0 3.0 4.0 5.0 합 = 15.000000, 평균 = 3.000000 주의 : scanf() 함수에서 double 형실수서식문자는 %lf 26
다음코드의결과는무엇인가요? 4) 실수배열과문자배열 double x[5]={0.0, max=0.0; int i=0; printf(" 실수 5 개를입력하세요. "); for(i=0;i<5;i++) scanf("%lf", &x[i]); max=x[0]; for(i=1;i<5;i++) if(max<x[i]) max=x[i]; printf("max = %f \n", max); [ 실행결과 ] 실수 5 개를입력하세요. 7.0 8.0 1.0 9.0 2.0 max = 9.000000 27 최대값구하기작동방식 (1) 4) 실수배열과문자배열 x[0] x[1] x[2] x[3] x[4] max = x[0]; if(max < x[1]) max = x[1]; if(max < x[2]) max = x[2]; if(max < x[3]) max = x[3]; if(max < x[4]) max = x[4]; 28
최대값구하기작동방식 (2) 4) 실수배열과문자배열 7.0 8.0 1.0 9.0 2.0 x[0] x[1] x[2] x[3] x[4] max = 7.0; if(max < x[1]) max = 8.0; if(max < x[2]) max = 8.0; if(max < x[3]) max = 9.0; if(max < x[4]) max = 9.0; 29 4) 실수배열과문자배열 ( 실습 4) 실수 5 개를입력받은후입력받은순서와반대로출력하시오. 입력예시 출력예시 1.1 2.2 3.0 4.0 5.0 5.000000 4.000000 3.000000 2.200000 1.100000 30
4) 실수배열과문자배열 ( 실습 5) 100 이하의실수 5 개를입력받은후, 최솟값을출력하는코드를작성하시오. 입력예시 출력예시 1.1 2.2 3.0 4.0 5.0 1.100000 31 4) 실수배열과문자배열 ( 실습 6) ( 실습 5) 에서실수 5개를입력받은후, 최솟값을출력하는코드를작성하였다. ( 실습 5) 프로그램을이용하시오. 최솟값이저장되어있는배열에서인덱스도함께출력하시오. 입력예시 출력예시 3.0 2.2 1.1 4.0 5.0 1.100000 2 32
문자배열초기화 4) 실수배열과문자배열 문자배열각원소를대문자로변경하시오. int i; char ar[4]={'d','u','c','k'; ar[0]='d', ar[1]='u', ar[2]='c', ar[3]='k'; for(i=0;i<4;i++) printf("%c ",ar[i]); printf("\n"); D U C K 33 문자배열을출력하시오. 4) 실수배열과문자배열 ( 예제 ) 문자배열안에있는각단어를출력하시오. int i; char ar[9]={'d','u','c','k',' ','p','o','n','d'; for(i=0;i<9;i++) printf("%c ",ar[i]); printf("\n"); for(i=0;i<4;i++) printf("%c ",ar[i]); printf("\n"); for(i=5;i<9;i++) printf("%c ",ar[i]); printf("\n"); d u c k d u c k p o n d p o n d 다른자료형도실수배열과문자배열과같은형식으로쓸수있다. 예 ) unsigned int arr[3]; short score[3]; 34
5) 다차원배열 배열 : 변수를여러개만들기위한효과적인방법 일차원배열 : 여러개의변수를구분할때인덱스한개만을이용 이차원배열 : 변수를구분하기위해두개의인덱스를이용 int a[100]; // 일차원배열의선언 int b[10][10]; // 동일하게 100 개의변수가생기지만인덱스가두개임 35 5) 다차원배열 왜인덱스가두개필요할까? 학생들의성적을저장하는배열을선언한다고할경우 5 명의국어성적만을고려한다면 int score[5]={78, 93, 20, 44, 88; 만약영어성적까지고려해야한다면 10 개의데이터를저장해야한다 int score[10]={78, 89, 93, 100, 20, 30, 44, 55, 88, 12; 첫번째학생의성적 만약국어성적의합을계산하려고한다면두가지성적이섞여있어서계산이쉽지않을것이다 36
5) 다차원배열 해결책은무엇일까? int score[5][2]={{78, 89, {93, 100, {20, 30, {44, 55, {88, 12; score[0][0] score[0][1] 첫번째학생의국어성적 첫번째학생의영어성적 첫번째인덱스 : 학생의번호를의미 두번째인덱스 : 과목의번호를의미 ( 국어 0, 영어 1) 이러한방식으로구분해주면 학생을기준으로계산하는것이가능하고 과목을기준으로계산하는것도쉬워진다 37 5) 다차원배열 배열선언 int a[5][2]; int b[10][10]; 총 10개의변수가생긴다 (2개씩 5개 ) 총 100개의변수가생긴다 38
5) 다차원배열 학생별국어, 영어, 수학성적출력하기 int a[2][3]={{10,20,50, {20,30,40; // { 국어, 영어, 수학 int i=0, j=0; for(i=0;i<2;i++) { for(j=0;j<3;j++) { printf("a[%d][%d] = %d \n", i, j, a[i][j]); [ 실행결과 ] a[0][0] = 10 a[0][1] = 20 a[0][2] = 50 a[1][0] = 20 a[1][1] = 30 a[1][2] = 40 39 5) 다차원배열 학생별국어, 영어, 수학성적입력한후출력하기 int a[2][3]={ 0 ; // { 국어, 영어, 수학 int i=0, j=0; [ 출력예시 ] for (i = 0; i<2; i++) { a[0][0] = 10 for (j = 0; j<3; j++) { a[0][1] = 20 scanf("%d", &a[i][j]); a[0][2] = 50 a[1][0] = 20 a[1][1] = 30 for(i=0;i<2;i++) { a[1][2] = 40 for(j=0;j<3;j++) { printf("a[%d][%d] = %d \n", i, j, a[i][j]); [ 입력예시 ] 10 20 50 20 30 40 40
5) 다차원배열 ( 예제 : 평균 ) 학생 3 명의국어, 영어성적이있다. 이자료를저장하기위한 2 차원배열을선언하고초기화하시오. 국어와영어과목의평균을각각출력하시오. 국어 영어 학생 A 20 100 학생 B 70 36 학생 C 30 50 41 5) 다차원배열 ( 예제 : 평균 ) int main(void) { int i=0; int score[3][2]= { {20, 100, {70, 36, {30, 50 ; int kor_sum=0, eng_sum=0; for(i=0; i<3; i++) { kor_sum = kor_sum + score[i][0]; eng_sum = eng_sum + score[i][1]; printf(" 국어 = %f, 영어 = %f\n", kor_sum/3.0, eng_sum/3.0); [ 실행결과 ] 국어 = 40.000000, 영어 = 62.000000 42
5) 다차원배열 초기화예제 (1) int a[5][2]={{78, 89, {93, 100, {20, 30, {44, 55, {88, 12; 학생 0번 a[0][0]=78 a[0][1]=89 학생 1번 a[1][0]=93 a[1][1]=78 학생 2번 a[2][0]=20 a[2][1]=78 학생 3번 a[3][0]=44 a[3][1]=78 학생 4번 a[4][0]=88 a[4][1]=78 43 초기화예제 (2) 5) 다차원배열 int a[2][3]={{10,20,50,{20,30,40; a[0][0]=10 a[0][1]=20 a[0][2]=50 a[1][0]=20 a[1][1]=30 a[1][2]=40 초기화예제 (3) 0 으로초기화 int a[2][3]={0; 44
5) 다차원배열 초기화할때배열의크기를비워둘수있을까? 컴파일러입장에서크기가모호하므로허용하지않음 int score[][]={{20,100,{70,35,{30,70,{80,80,{90,25; [ 컴파일오류발생 ] error C2087: score : 첨자가없습니다. error C2078: 이니셜라이저가너무많습니다. 45 5) 다차원배열 맨처음인덱스만비울수있다 int score[ ][2]={{20,100,{70,35,{30,70,{80,80,{90,25; 46
5) 다차원배열 ( 실습 7) 사용자에게서총 9 개의숫자를입력받아, 3 X 3 배열을초기화하시오. 3 X 3 표형태로출력하시오. 입력예시 1 출력예시 1 9 8 7 6 5 4 3 2 1 9 8 7 6 5 4 3 2 1 47 5) 다차원배열 ( 실습 8) 1) 3 X 3 배열을선언하고모두 0으로초기화하시오 2) 배열의값을 3 X 3 표형태로출력하시오. 3) 사용자로부터값을바꾸고싶은행과열그리고새로운값을받는다. 4) 사용자가입력한정보를토대로배열의값을바꾸시오. 5) 배열의값을 3 X 3 표형태로한번더출력하시오. 입력예시 1 출력예시 1 1 2 7 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 48
5) 다차원배열 반별학생 3 명의국어, 영어성적이있다. 1 반 국어 영어 학생 A 20 100 학생 B 70 36 학생 C 30 50 2 반 국어 영어 학생 A 30 100 학생 B 80 40 학생 C 40 60 49 두반의국어성적만출력하기 5) 다차원배열 int a[2][3][2]={{{20,100, {70,36,{30,50, {{30,100, {80,40,{40,60; int i=0, j=0, k=0; for(i=0;i<2;i++){ 1반국어 printf("%d반국어 \n", i+1); for(j=0;j<3;j++) { a[0][0][0] = 20 printf("a[%d][%d][%d] = %d \n", a[0][1][0] = 70 i, j, 0, a[i][j][0]); a[0][2][0] = 30 2반국어 a[1][0][0] = 30 a[1][1][0] = 80 a[1][2][0] = 40 50