쉽게풀어쓴 C 언어 Express 제 10 장배열
이번장에서학습할내용 반복의개념이해 배열의개념 배열의선언과초기화 일차원배열 다차원배열 배열을사용하면한번에여러개의값을저장할수있는공간을할당받을수있다.
배열의필요성 학생이 10 명이있고이들의평균성적을계산한다고가정하자. 개별변수를사용하는방법은학생수가많아지면번거로워집니다. 방법 #1 : 개별변수사용 int s0; int s1; int s9; 방법 #1 : 배열사용 int[10];
배열이란? 배열 (array): 동일한타입의데이터가여러개저장되어있는데이터저장장소 배열안에들어있는각각의데이터들은정수로되어있는번호 ( 첨자 ) 에의하여접근 배열을이용하면여러개의값을하나의이름으로처리할수있다.
배열원소와인덱스 인덱스 (index): 배열원소의번호 첨자또는인덱스
배열의선언 자료형 : 배열원소들이 int형라는것을의미 배열이름 : 배열을사용할때사용하는이름이 grade 배열크기 : 배열원소의개수가 10개 인덱스 ( 배열번호 ) 는항상0부터시작한다. int score[60]; float cost[12]; char name[50]; char src[10], dst[10]; int index, days[7]; // 60 개의 int 형값을가지는배열 grade // 12 개의 float 형값을가지는배열 cost // 50개의 char형값을가지는배열 name // 2개의문자형배열을동시에선언 // 일반변수와배열을동시에선언
배열원소접근 80 grade[0] grade[1] grade[2] grade[3] grade[4] grade[5] grade[6] grade[7] grade[8] grade[9] grade[5] = 80 인덱스 grade[5] = 80; grade[1] = grade[0]; grade[i] = 100; // i는정수변수 grade[i+2] = 100; // 수식이인덱스가된다. grade[index[3]] = 100; // index[] 는정수배열
배열선언예제 #include <stdio.h> int main(void) int i; int grade[5]; grade[0] = 10; grade[1] = 20; grade[2] = 30; grade[3] = 40; grade[4] = 50; grade[0]=10 grade[1]=20 grade[2]=30 grade[3]=40 grade[4]=50 for(i=0;i < 5; i++) printf("grade[%d]=%d\n",i, grade[i]); return 0;
배열과반복문 배열의가장큰장점은반복문을사용하여서배열의원소를간편하게처리할수있다는점 grade[0] = 0; grade[1] = 0; grade[2] = 0; grade[3] = 0; grade[4] = 0; #define SIZE 5... for(i=0 ; i<size ; i++) grade[i] = 0;
배열선언예제 #include <stdio.h> #include <stdlib.h> #define SIZE 5 int main(void) int i; int grade[size]; grade[0]=41 grade[1]=67 grade[2]=34 grade[3]=0 grade[4]=69 for(i = 0; i < SIZE; i++) grade[i] = rand() % 100; for(i = 0; i < SIZE; i++) printf("grade[%d]=%d\n", i, grade[i]); return 0;
배열선언예제 #include <stdio.h> #include <stdlib.h> #define SIZE 5 int main(void) int i; int grade[size]; printf("5 명의점수를입력하시오 \n"); for(i = 0; i < SIZE; i++) scanf("%d", &grade[i]); 5 명의점수를입력하시오 23 35 67 45 21 grade[0]=23 grade[1]=35 grade[2]=67 grade[3]=45 grade[4]=21 for(i = 0; i < SIZE; i++) printf("grade[%d]=%d\n", i, grade[i]); return 0;
배열선언예제 #include <stdio.h> #define STUDENTS 5 int main(void) 학생들의성적을입력하시오 : 10 학생들의성적을입력하시오 : 20 학생들의성적을입력하시오 : 30 int grade[students]; 학생들의성적을입력하시오 : 40 int sum = 0; 학생들의성적을입력하시오 : 50 int i, average; 성적평균 = 30 for(i = 0; i < STUDENTS; i++) printf(" 학생들의성적을입력하시오 : "); scanf("%d", &grade[i]); for(i = 0; i < STUDENTS; i++) sum += grade[i]; average = sum / STUDENTS; printf(" 성적평균 = %d\n", average); return 0;
잘못된인덱스문제 인덱스가배열의크기를벗어나게되면프로그램에치명적인오류를발생시킨다. C 에서는프로그래머가인덱스가범위를벗어나지않았는지를확인하고책임을져야한다. int grade[5]; grade[5] = 60; // 치명적인오류!
잘못된인덱스예제 #include <stdio.h> int main(void) int grade[5]; int i; 시스템에심각한오류가발생할수도있다. grade[0]=10; grade[1]=20; grade[2]=30; grade[3]=40; grade[4]=50; grade[5]=60; for(i = 0; i <= 5; i++) printf("grade[%d]=%d\n", i, grade[i]); return 0;
중간점검 독립적인여러개의변수대신에배열을사용하는이유는무엇인가? n개의원소를가지는배열의경우, 첫번째원소의번호는무엇인가? n개의원소를가지는배열의경우, 마지막원소의번호는무엇인가? 배열원소의번호혹은위치를무엇이라고하는가? 배열의크기보다더큰인덱스를사용하면어떻게되는가? 배열의크기를나타낼때변수를사용할수있는가?
배열의초기화 int grade[5] = 10,20,30,40,50 ; int grade[5] = 10, 20, 30, 40, 50 ; grade[0] grade[1] grade[2] grade[3] grade[4] int grade[5] = 10,20,30 ; 초기값을일부만주면나머지 int grade[5] = 10, 20, 30 ; 원소들은 0 으로초기화됩니다. 0 0 grade[0] grade[1] grade[2] grade[3] grade[4]
배열의초기화 배열의크기가주어지지않으면자동적으로초기값의개수만큼이배열의크기로잡힌다. 6 int grade[ ] = 10, 20, 30, 40, 50, 60 ; grade[0] grade[1] grade[2] grade[3] grade[4] grade[5]
#include <stdio.h> int main(void) int grade[5] = 31, 63, 62, 87, 14 ; int i; 배열초기화예제 for(i = 0; i < 5; i++) printf("grade[%d] = %d\n", i, grade[i]); return 0; grade[0] = 31 grade[1] = 63 grade[2] = 62 grade[3] = 87 grade[4] = 14
#include <stdio.h> int main(void) int grade[5] = 31, 63 ; int i; 배열초기화예제 for(i = 0; i < 5; i++) printf("grade[%d] = %d\n", i, grade[i]); return 0; grade[0] = 31 grade[1] = 63 grade[2] = 0 grade[3] = 0 grade[4] = 0
배열초기화예제 #include <stdio.h> int main(void) int grade[5] ; int i; for(i = 0; i < 5; i++) printf("grade[%d] = %d\n", i, grade[i]); return 0; grade[0]=4206620 grade[1]=0 grade[2]=4206636 grade[3]=2018779649 grade[4]=1
배열초기화예제 #include <stdio.h> int main(void) int grade[5] ; int i; for(i = 0; i < 5; i++) printf("grade[%d] = %d\n", i, grade[i]); return 0; grade[0]=4206620 grade[1]=0 grade[2]=4206636 grade[3]=2018779649 grade[4]=1
배열원소의개수계산 int grade[] = 1, 2, 3, 4, 5, 6 ; int i, size; 배열원소개수자동계산 size = sizeof(grade) / sizeof(grade[0]); for(i = 0; i < size ; i++) printf("%d ", grade[i]);
배열의복사 int grade[size]; int score[size]; 잘못된방법 score = grade; // 컴파일오류! #include <stdio.h> #define SIZE 5 int main(void) int i; int a[size]=1,2,3,4,5; int b[size]; 올바른방법 for(i = 0; i < SIZE; i++) b[i] = a[i]; 원소를일일이복사한다 return 0;
#include <stdio.h> #define SIZE 5 배열의비교 int main(void) int i; int a[size] = 1, 2, 3, 4, 5 ; int b[size] = 1, 2, 3, 4, 5 ; if( a == b ) // 1 올바르지않은배열비교 printf(" 잘못된결과입니다.\n"); else printf(" 잘못된결과입니다.\n"); for(i = 0; i < SIZE ; i++) // 2 올바른배열비교 if ( a[i]!= b[i] ) printf("a[] 와 b[] 는같지않습니다.\n"); return 0; printf("a[] 와 b[] 는같습니다.\n"); return 0; 원소를일일이비교한다
중간점검 배열 a[6] 의원소를 1, 2, 3, 4, 5, 6 으로초기화하는문장을작성하라. 배열의초기화에서초기값이개수가배열원소의개수보다적은경우에는어떻게되는가? 또반대로많은경우에는어떻게되는가? 배열의크기를주지않고초기값의개수로배열의크기를결정할수있는가? 배열 a, b를 if(a==b) 와같이비교할수있는가? 배열 a에배열b를a=b; 와같이대입할수있는가?
실습 : 극장예약시스템 배열을이용하여간단한극장예약시스템을작성 좌석은 10개 먼저좌석배치표를보여준다. 예약이끝난좌석은 1로, 예약이안된좌석은 0으로나타낸다.
실행결과 좌석을예약하시겠습니까?(y 또는 n) y ------------------------------- 1 2 3 4 5 6 7 8 9 10 ------------------------------- 0 0 0 0 0 0 0 0 0 0 몇번째좌석을예약하시겠습니까?1 예약되었습니다. 좌석을예약하시겠습니까?(y 또는 n) y ------------------------------- 1 2 3 4 5 6 7 8 9 10 ------------------------------- 1 0 0 0 0 0 0 0 0 0 몇번째좌석을예약하시겠습니까?1 이미예약된자리입니다. 다른좌석을선택하세요좌석을예약하시겠습니까?(y 또는 n) n
알고리즘 while(1) 사용자로부터예약여부 (y 또는 n) 를입력받는다. if 입력 == 'y' 현재의좌석배치표 seats[] 를출력한다. 좌석번호 i 를사용자로부터입력받는다. if 좌석번호가올바르면 seats[i]=1 else 에러메시지를출력한다. else 종료한다.
실습 : 극장좌석예약 #include <stdio.h> #define SIZE 10 int main(void) char ans1; int ans2, i; int seats[size] = 0; while(1) printf(" 좌석을예약하시겠습니까?(y 또는n) "); scanf(" %c",&ans1); if(ans1 == 'y') printf("-------------------------------\n"); printf(" 1 2 3 4 5 6 7 8 9 10\n"); printf("-------------------------------\n"); for(i = 0; i < SIZE; i++) printf(" %d", seats[i]); printf("\n"); printf(" 몇번째좌석을예약하시겠습니까 ); scanf("%d",&ans2); 현재좌석예약상태출력
실습 : 극장좌석예약 if(ans2 <= 0 ans2 > SIZE) printf("1부터 10사이의숫자를입력하세요 \n"); continue; if(seats[ans2-1] == 0) // 예약되지않았으면 seats[ans2-1] = 1; printf(" 예약되었습니다.\n"); else // 이미예약되었으면 printf(" 이미예약된자리입니다.\n"); else if(ans1 == 'n') return 0; return 0;
도전문제 위의프로그램에서는한명만예약할수있다. 하지만극장에혼자서가는경우는드물다. 따라서한번에 2 명을예약할수있도록위의프로그램을변경하여보자.
실습 : 최소값찾기 우리는인터넷에서상품을살때, 가격비교사이트를통하여가장싼곳을검색한다. 일반적으로배열에들어있는정수중에서최소값을찾는문제와같다.
실행결과 --------------------------------------- 1 2 3 4 5 6 7 8 9 10 --------------------------------------- 28 81 60 83 67 10 66 97 37 94 최소값은 10 입니다.
알고리즘 배열 prices[] 의원소를난수로초기화한다. 일단첫번째원소를최소값 minium이라고가정한다. for(i=1; i< 배열의크기 ; i++) if ( prices[i] < minimum ) minimum = prices[i] 반복이종료되면 minimum에최소값이저장된다.
실습 : 최소값찾기 #include <stdio.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #define SIZE 10 int main(void) int prices[size] = 0 ; int i, minimum; printf("---------------------------------------\n"); printf("1 2 3 4 5 6 7 8 9 10\n"); printf("---------------------------------------\n"); srand( (unsigned)time( NULL ) ); for(i = 0; i < SIZE; i++) prices[i] = (rand()%100)+1; printf("%-3d ",prices[i]); printf("\n\n"); 물건의가격출력
실습 : 최소값찾기 첫번째배열원소를최소값으로가정 minimum = prices[0]; for(i = 1; i < SIZE; i++) if( prices[i] < minimum ) minimum = prices[i]; printf(" 최소값은 %d입니다.\n", minimum); return 0; 현재의최소값보다배열원소가작으면, 배열원소를최소값으로복사한다. 50 40 30 20 10 20 30 40 60 70 grade[0] grade[1] grade[2] grade[3] grade[4] grade[5] grade[6] grade[7] grade[8] grade[9] 40 30 20 50 10 min > > > > > < < < <
도전문제 위의프로그램에서는최소값을계산하였다. 이번에는배열의원소중에서최대값을찾도록변경하여보자. 변수이름도적절하게변경하라.
실습 : 투표집계하기 투표결과를컴퓨터를이용하여서집계한다고가정하자. 데이터의빈도 (frequency) 를계산하는것과동일 배열의개념을이용하면손쉽게구현할수있다.
실행결과 몇번후보자를선택하시겠습니까?( 종료 -1): 1 몇번후보자를선택하시겠습니까?( 종료 -1): 1 몇번후보자를선택하시겠습니까?( 종료 -1): -1 값득표결과 1 2 2 0 3 0 4 0... 9 0 10 0
알고리즘 배열 freq[] 의원소를 0으로초기화한다. while(1) 사용자로부터후보자를입력받는다. freq[candidate]++; freq 배열의내용을출력한다. 0 0 01 +1 freq[0] freq[1]..... freq[100] 100 score SIZE = 101
소스 #include <stdio.h> #define SIZE 11 int main(void) int freq[size] = 0 ; // 빈도를나타내는배열 int i, candidate; while(1) printf(" 몇번후보자를선택하시겠습니까?( 종료-1): "); scanf("%d", &candidate); if (candidate < 0) break; // 음수이면반복종료 freq[candidate]++; printf(" 값득표결과 \n"); 해당되는점수의 for(i = 1; i < SIZE; i++) 빈도를증가한다 printf("%3d %3d \n", i, freq[i]);. return 0;
도전문제 C 에서는배열의인덱스가항상 0 부터시작한다. 하지만일상생활에서는번호가 1 부터시작한다. 여기서발생되는문제가상당히있다. 위의프로그램에서도만약배열의크기를 10 으로한다면어떻게변경하여야하는가?
배열원소역순출력 #include <stdio.h> #define SIZE 5 int main(void) int data[size]; int i; 10 20 30 40 50 data[0] data[1] data[2] data[3] data[4] for(i = 0; i < SIZE; i++) // 정수를입력받는루프 printf(" 정수를입력하시오 :"); scanf("%d", &data[i]); for(i = SIZE - 1;i >= 0; i--) printf("%d\n", data[i]); return 0; // 역순출력루프 SIZE = 5 정수를입력하시오 :10 정수를입력하시오 :20 정수를입력하시오 :30 정수를입력하시오 :40 정수를입력하시오 :50 50 40 30 20 10
예제 #include <stdio.h> #define STUDENTS 5 30 20 10 40 50 int main(void) int grade[students] = 30, 20, 10, 40, 50 ; int i, s; grade[0] grade[1] grade[2] grade[3] grade[4] STUDENTS = 5 for(i = 0; i < STUDENTS; i++) printf(" 번호 %d: ", i); for(s = 0; s < grade[i]; s++) printf("*"); printf("\n"); 번호 0: ****************************** 30 번호 1: ******************** 20 번호 2: ********** 10 번호 3: **************************************** 40 번호 4: ************************************************** 50 return 0;
#include <stdio.h> #include <stdlib.h> 주사위면빈도계산 #define SIZE 6 int main(void) int freq[size] = 0 ; // 주사위의면의빈도를 0 으로한다. int i; for(i = 0; i < 10000; i++) // 주사위를 10000번던진다. ++freq[ rand() % 6 ]; // 해당면의빈도를하나증가한다. printf("====================\n"); printf(" 면빈도 \n"); printf("====================\n"); for(i = 0; i < SIZE; i++) printf("%3d %3d \n", i, freq[i]); return 0; ==================== 면빈도 ==================== 0 1657 1 1679 2 1656 3 1694 4 1652 5 1662
배열과함수 배열의경우에는사본이아닌원본이전달된다. int main(void)... get_average(, int n);... 배열매개변수의경우, 원본이직접참조됩니다. int get_average(int score[], int n)... sum += score[i];...
배열과함수 #include <stdio.h> #define STUDENTS 5 int get_average(int score[], int n); // 1 int main(void) int grade[students] = 1, 2, 3, 4, 5 ; int avg; avg = get_average(grade, STUDENTS); printf(" 평균은 %d 입니다.\n", avg); return 0; 배열이인수인경우, 참조에의한호출 배열의원본이 score[] 로전달 int get_average(int score[], int n) int i; int sum = 0; // 2 for(i = 0; i < n; i++) sum += score[i]; return sum / n;
배열이함수의인수인경우 1/2 #include <stdio.h> #define SIZE 7 void square_array(int a[], int size); void print_array(int a[], int size); int main(void) int list[size] = 1, 2, 3, 4, 5, 6, 7 ; print_array(list, SIZE); square_array(list, SIZE); print_array(list, SIZE); // 배열은원본이전달된다. ( 인수 : 배열 ) return 0;
배열이함수의인수인경우 2/2 void square_array(int a[], int size) int i; for(i = 0; i < size; i++) a[i] = a[i] * a[i]; void print_array(int a[], int size) int i; 배열의원본이 a[] 로전달 for(i = 0; i < size; i++) printf("%3d ", a[i]); printf("\n"); 1 2 3 4 5 6 7 1 4 9 16 25 36 49
원본배열의변경을금지하는방법 void print_array(const int a[], int size)... a[0] = 100; // 컴파일오류! 함수안에서 a[] 는변경할수없다.
중간점검 배열을함수로전달하면원본이전달되는가? 아니면복사본이전달되는가? 함수가전달받은배열을변경하지못하게하려면어떻게하여야하는가?
정렬이란? 정렬은물건을크기순으로오름차순이나내림차순으로나열하는것 정렬은컴퓨터공학분야에서가장기본적이고중요한알고리즘중의하나
정렬이란? 정렬은자료탐색에있어서필수적이다. ( 예 ) 만약사전에서단어들이정렬이안되어있다면?
선택정렬 (selection sort) 선택정렬 (selection sort): 정렬이안된숫자들중에서최소값을선택하여배열의첫번째요소와교환
선택정렬 (selection sort) 선택정렬 (selection sort): 정렬이안된숫자들중에서최소값을선택하여배열의첫번째요소와교환 몇개의단계만살펴보자. 5 3 8 1 2 7
선택정렬 #include <stdio.h> #define SIZE 10 int main(void) int list[size] = 3, 2, 9, 7, 1, 4, 8, 0, 6, 5 ; int i, j, temp, least; for(i = 0; i < SIZE-1; i++) least = i; for(j = i + 1; j < SIZE; j++) if(list[j] < list[least]) least = j; temp = list[i]; list[i] = list[least]; list[least] = temp; 내부 for 루프로서 (i+1) 번째원소부터배열의마지막원소중에서최소값을찾는다. 현재의최소값과비교하여더작은정수가발견되면그정수가들어있는인덱스를 least 에저장한다. 0 1 2 3 4 5 6 7 8 9 for(i = 0;i < SIZE; i++) printf("%d ", list[i]); printf("\n"); return 0; list[i] 와 list[least] 를서로교환
변수의값을서로교환할때 다음과같이하면안됨 grade[i] = grade[least]; // grade[i] 의기존값은파괴된다! grade[least] = grade[i]; 올바른방법 temp = list[i]; list[i] = list[least]; list[least] = temp;
순차탐색 순차탐색은배열의원소를순서대로하나씩꺼내서탐색키와비교하여원하는값을찾아가는방법 비교 50 성공 1 0 20 30 40 50 10 grade[0] grade[1] grade[2] grade[3] grade[4] grade[5]
순차탐색 #include <stdio.h> #define SIZE 10 int main(void) int key, i; int list[size] = 1, 2, 3, 4, 5, 6, 7, 8, 9 ; printf(" 탐색할값을입력하시오 :"); scanf("%d", &key); for 루프를이용하여 list[i] 와 key 를비교하는연산을배열의크기만큼반복한다. 만약 list[i] 와 key 가같으면탐색은성공되고키값이발견된배열의인덱스를출력한다. for(i = 0; i < SIZE; i++) if(list[i] == key) 탐색할값을입력하시오 :7 탐색성공인덱스 = 6 탐색종료 printf(" 탐색성공인덱스 = %d\n", i); printf(" 탐색종료 \n"); return 0;
이진탐색 이진탐색 (binary search): 정렬된배열의중앙에위치한원소와비교되풀이
이진탐색 #include <stdio.h> #define SIZE 16 int binary_search(int list[], int n, int key); int main(void) int key; int grade[size] = 2,6,11,13,18,20,22,27,29,30,34,38,41,42,45,47 ; printf(" 탐색할값을입력하시오 :"); scanf("%d", &key); printf(" 탐색결과 = %d\n", binary_search(grade, SIZE, key)); return 0;
이진탐색 int binary_search(int list[], int n, int key) int low, high, middle; low = 0; high = n-1; while( low <= high ) // 아직숫자들이남아있으면 printf("[%d %d]\n", low, high); // 하한과상한을출력한다. middle = (low + high)/2; // 중간위치를계산한다. if( key == list[middle] ) // 일치하면탐색성공 return middle; else if( key > list[middle] )// 중간원소보다크다면 low = middle + 1; // 새로운값으로 low 설정 else high = middle - 1; // 새로운값으로 high 설정 return -1;
실행결과 탐색할값을입력하시오 :34 [0 15] [8 15] [8 10] [10 10] 탐색결과 = 10
int s[10]; // 1차원배열 int s[3][10]; // 2차원배열 int s[5][3][10]; // 3차원배열 2 차원배열
2 차원배열의구현 2 차원배열은 1 차원적으로구현된다.
2 차원배열의활용 #include <stdio.h> int main(void) int s[3][5]; int i, j; int value = 0; // 2차원배열선언 // 2개의인덱스변수 // 배열원소에저장되는값 for(i=0;i<3;i++) for(j=0;j<5;j++) s[i][j] = value++; for(i=0;i<3;i++) for(j=0;j<5;j++) printf("%d\n", s[i][j]); return 0; 0 1 2 3... 11 12 13 14
2 차원배열의초기화 int s[3][5] = 0, 1, 2, 3, 4, // 첫번째행의원소들의초기값 10, 11, 12, 13, 14, // 두번째행의원소들의초기값 20, 21, 22, 23, 24 // 세번째행의원소들의초기값 ;
2 차원배열의초기화 int s[ ][5] = 0, 1, 2, 3, 4, // 첫번째행의원소들의초기값 10, 11, 12, 13, 14, // 두번째행의원소들의초기값 20, 21, 22, 23, 24, // 세번째행의원소들의초기값 ;
2 차원배열의초기화 int s[ ][5] = 0, 1, 2, // 첫번째행의원소들의초기값 10, 11, 12, // 두번째행의원소들의초기값 20, 21, 22 // 세번째행의원소들의초기값 ;
2 차원배열의초기화 int s[ ][5] = 0, 1, 2, 3, 4, // 첫번째행의원소들의초기값 5, 6, 7, 8, 9, // 두번째행의원소들의초기값 ;
3 차원배열 #include <stdio.h> int main(void) int s[3][3][3]; int x, y, z; int i= 1; // 3차원배열선언 // 3개의인덱스변수 // 배열원소에저장되는값 for(z=0;z<3;z++) for(y=0;y<3;y++) for(x=0;x<3;x++) s[z][y][x] = i++; return 0;
다차원배열인수 #include <stdio.h> #define YEARS 3 #define PRODUCTS 5 총매출은 45 입니다. int sum(int grade[][products]); int main(void) int sales[years][products] = 1, 2, 3, 4, 5, 6, 7, 8, 9 ; int total_sale; total_sale = sum(sales); printf(" 총매출은 %d입니다.\n", total_sale); return 0; int sum(int grade[][products]) int y, p; int total = 0; for(y = 0; y < YEARS; y++) for(p = 0; p < PRODUCTS; p++) total += grade[y][p]; return total; 첫번째인덱스의크기는적지않아도된다.
#include <stdio.h> #define CLASSES 3 #define STUDENTS 5 다차원배열예제 학급 0 의평균성적 = 2 학급 1 의평균성적 = 12 학급 2 의평균성적 = 22 전체학생들의평균성적 = 12 int main(void) int s[classes][students] = 0, 1, 2, 3, 4, // 첫번째행의원소들의초기값 10, 11, 12, 13, 14, // 두번째행의원소들의초기값 20, 21, 22, 23, 24, // 세번째행의원소들의초기값 ; int clas, student, total, subtotal; total = 0; for(clas = 0; clas < CLASSES; clas++) subtotal = 0; for(student = 0; student < STUDENTS; student++) subtotal += s[clas][student]; printf(" 학급 %d 의평균성적 = %d\n", clas, subtotal / STUDENTS); total += subtotal; printf(" 전체학생들의평균성적 = %d\n", total/(classes * STUDENTS)); return 0;
행렬 행렬 (matrix) 는자연과학에서많은문제를해결하는데사용
다차원배열을이용한행렬의표현 #include <stdio.h> #define ROWS 3 #define COLS 3 int main(void) int A[ROWS][COLS] = 2,3,0, 8,9,1, 7,0,5 ; int B[ROWS][COLS] = 1,0,0, 1,0,0, 1,0,0 ; int C[ROWS][COLS]; int r,c; // 두개의행렬을더한다. for(r = 0;r < ROWS; r++) for(c = 0;c < COLS; c++) C[r][c] = A[r][c] + B[r][c]; // 행렬을출력한다. for(r = 0;r < ROWS; r++) for(c = 0;c < COLS; c++) printf("%d ", C[r][c]); printf("\n"); return 0; 중첩 for 루프를이용하여행렬 A 의각원소들과행렬의 B 의각원소들을서로더하여행렬 C 에대입한다. 3 3 0 9 9 1 8 0 5
중간점검 다차원배열 int a[3][2][10] 에는몇개의원소가존재하는가? 다차원배열 int a[3][2][10] 의모든요소를 0으로초기화하는문장을작성하시오.
실습 : tic-tac-toe tic-tac-toe 게임은 2명의경기자가오른쪽과같은보드를이용하여서번갈아가며 O와 X를놓는게임이다. 같은글자가가로, 세로, 혹은대각선상에놓이면이기게된다.
실행결과 (x, y) 좌표 ( 종료 -1, -1): 0 0 --- --- --- X --- --- --- --- --- --- --- --- --- (x, y) 좌표 ( 종료 -1, -1): 1 1 --- --- --- X --- --- --- O --- --- --- --- --- ---...
알고리즘 보드를초기화한다. while(1) 보드를화면에출력한다. 사용자로부터좌표 x, y 를받는다. if (board[x][y] 가비어있으면 ) if( 현재경기자가 X 이면 ) board[x][y] = X else else board[x][y] = O 오류메시지를출력한다
소스 #include <stdio.h> #include <stdlib.h> void init_board(char board[][3]); int get_player_move(int palyer, char board[][3]); void disp_board(char board[][3]); int main(void) char board[3][3]; int quit=0; init_board(board); do disp_board(board); quit = get_player_move(0, board); disp_board(board); quit = get_player_move(1, board); while(quit == 0); return 0;
소스 void init_board(char board[][3]) int x, y; for(x=0; x<3; x++) for(y=0; y<3; y++) board[x][y] = ' '; void disp_board(char board[3][3]) int i; for(i=0; i<3; i++) printf("--- --- ---\n"); printf(" %c %c %c \n",board[i][0], board[i][1], board [i][2]); printf("--- --- ---\n");
소스 int get_player_move(int player, char board[3][3]) int x, y, done = 0; while(done!= 1) printf("(x, y) 좌표 ( 종료-1, -1): "); scanf("%d %d", &x, &y); if( x == -1 && y == -1 ) return 1; if(board[x][y]== ' ') break; // 올바른위치이면반복루프를나간다. else printf(" 잘못된위치입니다.\n"); if( player == 0 ) else board[x][y] = 'O'; board[x][y] = 'X'; return 0;
도전문제 보드를분석하여서게임이종료되었는지를검사하는함수를추가하라. 컴퓨터가다음수를결정하도록프로그램을변경하라. 가장간단한알고리즘을사용한다. 예를들면비어있는첫번째좌표에놓는다.
Q & A