프로그래밍 1 1 Chapter 7. Arrays May, 2016 Dept. of software Dankook University http://embedded.dankook.ac.kr/~baeksj
이장의강의목표 2 배열의정의를이해한다. 배열의선언방법을이해한다. 각배열원소를접근하는방법을이해한다. 문자열의특징을이해한다. 문자열관련라이브러리의사용방법을이해한다. 다차원배열을이해한다. 배열의초기화방법을이해한다. 문자열의배열을이해한다. 이장의결론
1 차원배열의선언 (1/10) 3 배열이란 : 같은유형을갖는변수들의집합 형식 type variable_name[size]; // array example int main() int i; int a[5]; // array define for (i=0; i<5; i++) a[i] = i*2; for (i=0; i<5; i++) printf("%d\n", a[i]); a 를배열의이름 (name) 이라고함 a[0], a[1], a[2], a[3], a[4] 를각각배열의원소 (element) 라고함 return 0; 배열에서색인 (index) 는 0 부터 size-1 까지사용가능
1 차원배열의선언 (2/10) 4 C 의기본유형변수선언및접근 0xfffffffc 번지 A memory 10 1.23 12.3 변수를선언하면메모리에변수공간이할당된다. int num; float f; double d; char ch; c번지 8번지 4번지 0번지 32bits 변수를초기화하면해당메모리값저장 num = 10; f = 1.23; d = f * num; ch = A ; printf( %c, %d\n, ch, num);
1 차원배열의선언 (3/10) 5 배열선언및각원소접근 0xfffffffc 번지 memory 8 a[4] 배열을선언하면 int a[5]; 6 4 2 0 a[3] a[2] a[1] a[0] 메모리입장에서 int a[5]; 는 int v,w,x,y,z; 를선언하고 a[0], a[1], a[2], a[3], a[4] 대신 v, w, x, y, z로접근하는것과동일. a는배열의시작위치, 즉시작하는메모리주소를가리킴 (a == &a[0], 주의 : a는포인터상수임!!) c번지 8번지 4번지 배열의각원소접근 for (i=0; i<5; i++) a[i] = i*2; printf("%d", a[3]); 0 번지 문자형배열을선언하면 32bits char b[6];
1 차원배열의선언 (4/10) 6 배열의장점 #include <stdlib.h> #include <time.h> 배열을이용한지난과제재구현 // 배열사용하지않음 int main() int num0, num1, num2, num3, num4, num5; #include <stdlib.h> #include <time.h> int main() int num[6], i, j; // 배열사용 srand(time(null)); srand(time(null)); while (1) num0 = rand()%45 + 1; num1 = rand()%45 + 1; num2 = rand()%45 + 1; num3 = rand()%45 + 1; num4 = rand()%45 + 1; num5 = rand()%45 + 1; 서로다른숫자 60 개라면? if ((num0!=num1) && (num0!=num2) && (num0!=num3) && (num0!=num4) && (num1!=num2) && (num1!=num3) && (num1!=num4) && (num2!=num3) && (num2!=num4) && (num3!=num4)) break; printf("%d,%d,%d,%d,%d,%d\n", num0,num1,num2,num3,num4, num5); for (i=0; i<6; i++) num[i] = rand()%45 + 1; for (j=0; j<i; j++) if (num[j] == num[i]) i ; break; for (i=0; i<6; i++) printf("%d ", num[i]); 문제풀이방법 (algorithm) 이결정되면, 그것을가장효과적으로구현할수있는자료구조선택능력이중요!! data structure 에는변수 ( 나열형 ), 배열, 리스트, 스택, 큐, 트리, hash, graph 등
1 차원배열의선언 (5/10) 7 배열사용시주의할점 배열의시작인덱스는 0. Boundary check: 배열의경계검사는프로그래머가담당. C 에서배열전체치환은지원안됨 // 배열주의사항 int main() int j=3; int num[3], i, sum = 0; int num2[3]; num[0] = 1; num[1] = 1; num[2] = 1; for (i=0; i<=3; i++) sum += num[i]; printf("%d\n", sum); num2 = num; // error. Then, how?
1 차원배열의선언 (6/10) 8 배열예제 : 한달동안매일정오의기온을입력받아평균기온과가장추운날과더운날구하기 Divide And Conquer 접근방법사용 int main() int i, temp[31], min, max, avg, days; printf("how many days in the month? :"); scanf("%d", &days); // days 값이양수가아니면예외처리 for (i=0; i<days; i++) printf("enter temperature for day %d: ", i+1); scanf("%d", &temp[i]); avg = 0; for (i=0; i<days; i++) avg += temp[i]; printf("average temperature : %d\n", avg/days);? printf("minimum Temperature : %d\n", min); printf("maximum Temperature : %d\n", max);
1 차원배열의선언 (7/10) 9 배열예제 #include <unistd.h> #include <termios.h> int main(void) int i; char mess[80]; struct termios old_tio, new_tio; tcgetattr(stdin_fileno,&old_tio); new_tio=old_tio; new_tio.c_lflag &=(~ICANON ); tcsetattr(stdin_fileno,tcsanow,&new_tio); printf("enter Message (less than 80 characters) \n"); for (i=0; i<80; i++) mess[i] = getchar(); if (mess[i] == '\n') break; printf("\n"); for (i=0; mess[i]!= '\n'; i++) printf("%c", mess[i]); printf("\n"); tcsetattr(stdin_fileno,tcsanow,&old_tio); return 0;
1 차원배열의선언 (8/10) 10 배열예제 // 숫자정렬 #include <stdlib.h> #include <time.h> int main() int org[5], cook[5], tmp; int i, j; srand(time(null)); for (i=0; i<5; i++) cook[i] = org[i] = rand() % 45 + 1; for (i = 1; i < 5; i++) for (j = 0; j < 5 i; j++) if (cook[j] > cook[j + 1]) // swap code tmp = cook[j]; cook[j] = cook[j + 1]; cook[j + 1] = tmp; for (i=0; i<5; i++) printf("%d\t%d\n", org[i], cook[i]);
1 차원배열의선언 (9/10) 11 bubble sorting 상세설명 Cook[5] = 5, 1, 12, -5, 16 5 1 12-1 16 5>1, swap 1 5-5 12 16 1<5, ok 1 5 12-1 16 5<12, ok 1 5-5 12 16 5>-5, swap 1 5 12-5 16 12>-5, swap 1-5 5 12 16 5<12, ok 1 5-5 12 16 12<16, ok <Step 1> <Step 2> 1-5 5 12 16-5 1 5 12 16 1>-5, swap 1<5, ok -5 1 5 12 16-5>1, ok <Step 3> <Step 4>
1 차원배열의선언 (10/10) 12 정렬 (sorting) 은실제프로그램에서많이사용됨 성적처리주소록정렬이진탐색을위한데이터관리최단거리 (shortest path) 발견 등등.. 정렬의방법 bubble sorting insertion sorting selection sorting quick sorting merge sorting Data Structure 수업에서직접작성해보시길
문자열 (string) 문자열의사용 (1/4) Null Character( \0 ) 로종료되는문자유형 (char type) 의 1 차원배열 로묶인문자들의집합 ( 컴파일러가자동으로 \0 추가 ) 문자열을저장할배열의크기는문자열의크기 + 1 (9page 예제의일부수정 ) 13 printf("enter Message (less than 80 characters) \n"); for (i=0; i<80; i++) mess[i] = getchar(); nice\n가입력되면.. if (mess[i] == '\n') break; n i c e \n mess[i] = '\0'; printf("\n"); for (i=0; mess[i]!= '\0'; i++) printf("%c", mess[i]); printf("\in"); puts(mess); printf("%s\n", mess); (9page 예제의일부수정 ) 1 차원문자배열이문자열로바뀜 \0 가없다면?
문자열의사용 (2/4) 14 문자열관련라이브러리 입출력 gets(str), puts(str): 입출력처리 ( \r 과 \0 간에변환 ) 문자열관리 strlen(), strcpy(), strcmp(), strcat() strcpy(to_str, from_str) : 문자열복사를사용하기위해포함 strcat(to_str, from_str) : 문자열연결 strcmp(str1, str2) : 문자열비교 ( 사전식순서 ) strlen(str) : 문자열길이복귀 ( \0 제외 ) Thank you \r 를입력하면? #include <string.h> // 문자열입출력예제 // strcpy() 를사용할때필요 main() char str1[80], str2[80]; printf("enter a string (less than 80 chars) : \n"); gets(str1); for (i=0; str2[i]; i++) strcpy(str2, str1); printf("%c", str2[i]); puts(str2); or printf( %s, str2);
문자열예제 문자열의사용 (3/4) 15 #include <string.h> main() char str1[80], str2[80]; int i; Thanks God \r 가입력되고 Its Friday \r 가입력 printf("enter the first string: "); gets(str1); printf("enter the second string: "); gets(str2); printf("%s is %d chars long\n", str1, strlen(str1)); printf("%s is %d chars long\n", str2, strlen(str2)); i = strcmp(str1, str2); if (!i) printf("the string are equal\n"); else if (i < 0) printf("%s is less than %s\n", str1, str2); else printf("%s is greater than %s\n", str1, str2); if (strlen(str1) + strlen(str2) < 80) strcat(str1, str2); printf("%s\n", str1);
문자열의사용 (4/4) 16 문자열예제 ( 개발자가흔히하는실수 ) #include <string.h> // 배열예제.. be cautious main() char limit = 'h'; char str[8]; int i, count = 0; gets(str); for (i=0; i<(int)strlen(str); i++) if (str[i] < limit) count++; harry 가입력되면? harrypotter 가입력되면? printf("[%d] characters are smaller than %c\n", count, limit);
다차원배열 (1/3) 17 이차원배열 형식 type variable_name[size][size]; 0xfffffffc 번지 memory int a[2][3]; a[1][2] a[1][1] a[1][0] a[0][2] a[0][1] a[0][0] a == &a[0][0], a[1] == &a[1][0]. c번지 8번지 4번지 0번지 삼차원배열 type variable_name[size][size][size]; 32bits
다차원배열 (2/3) 18 이차원배열의예 main() int i, j; int twod[4][5]; // 4X5 행렬 for (i=0; i<4; i++) for (j=0; j<5; j++) twod[i][j] = i*j; for (i=0; i<4; i++) for (j=0; j<5; j++) printf("%d ", twod[i][j]); printf("\n");
다차원배열 (3/3) 19 함께해봅시다 : 2 과목을수강하는 6 명의학생의시험점수를관리하기위한프로그램의템플릿 #define MAX_STUDENTS 6 #define NR_OF_SUBJECT 2 int score[max_students][nr_of_subject]; int main(void) int i, j; for (i=0; i<6; i++) for(j=0; j<2; j++) printf("[%d] 번째학생의 [%d] 번째과목성적은?", i+1, j+1); scanf("%d", &score[i][j]); printf("============listing===========\n"); for (i=0; i<6; i++) printf("[%d] 번째학생 :", i+1); for (j=0; j<2; j++) printf("\t [%d] 번째과목성적 : [%d]", j, score[i][j]); printf("\n"); return 0;
배열의초기화 (1/3) 20 형식 type variable_name[size]=value, value,, value; int main(void) int arr1[5]=1, 2, 3, 4, 5; int arr2[]=1, 2, 3, 4, 5, 6, 7; int arr3[5]=1, 2; int ar1len, ar2len, ar3len, i; ar1len = sizeof(arr1) / sizeof(int); // 배열 arr1 의길이계산 ar2len = sizeof(arr2) / sizeof(int); // 배열 arr2 의길이계산 ar3len = sizeof(arr3) / sizeof(int); // 배열 arr3 의길이계산 for(i=0; i<ar1len; i++) printf("%d ", arr1[i]); printf("\n"); for(i=0; i<ar2len; i++) printf("%d ", arr2[i]); printf("\n"); for(i=0; i<ar3len; i++) printf("%d ", arr3[i]); printf("\n"); return 0;
이차원배열의초기화 배열의초기화 (2/3) 21 // 2 차원배열초기화예제 int main() int i, j; int a[2][3] = 1, 2, 3, 4, 5, 6; char ch; int a[2][3] = 1, 2, 3, 4, 5, 6; or int a[2][3] = 1, 2, 4, 5; for (i=0; i<2; i++) for (j=0; j<3; j++) printf("%d ", a[i][j]); printf("\n"); printf("%d\n", sizeof(ch)); printf("%d\n", sizeof(i)); printf("%d\n", sizeof(a[0][0])); printf("%d\n", sizeof(a));
배열의초기화 (3/3) 22 배열의초기화시크기없는배열 (unsized array) 사용가능 #include <string.h> int main() char prompt[] = "Enter command"; int a[] = 1,4,9,16,25; int b[][3] = 1,4,9,16,25,36; printf("%s\n", prompt); printf("%d\n", a[4]); printf("%d %d %d\n", b[0][0], b[0][2], b[1][0]); b[2][] 또는 b[][] 는사용불가 C 에서는맨왼쪽차원만크기미지정가능 printf("%d, %d, %d\n", sizeof(prompt[0]), sizeof(prompt), strlen(prompt)); printf("%d, %d\n", sizeof(a), sizeof(a[0])); printf("%d, %d, %d\n", sizeof(b), sizeof(b[0][0]), sizeof(b[0]));
문자열배열 (1/2) 23 문자유형의이차원배열 ( 문자열의 1차원배열 ) 예제 : 학번을입력받아대응되는학생이름을출력 int main() char names[10][20]; int i, query; for (i=0; i<10; i++) printf("%d 번이름을입력하세요 : ", i+1); gets(names[i]); do printf(" 학생의번호입력 : "); scanf("%d", &query); query ; if ((query < 0) (query > 9)) printf(" 학생이없습니다 \n"); break; printf("%d번의이름은 %s\n", query+1, names[query]); while (1);
문자열배열 (2/2) 24 예제 : 전자사전 #include <string.h> char words[][2][40] = "grain", " 곡물 ", "grand", " 중요한, 화려한 ", "grant", " 허락하다 ", "grape", " 포도 ", "grasp", " 잡다, 쥐다 " "", "" ; int main() char query[12]; int i; printf("enter English word: "); gets(query); for (i=0; strcmp(words[i][0], ""); i++) if (!strcmp(words[i][0], query)) printf("==> %s\n", words[i][1]); break; if (!strcmp(words[i][0], "")) printf("not in dictionary\n");
이장의결론 25 배열을선언방법을이해각배열원소를접근하는방법을이해문자열의특징을이해 gets, puts, strcpy, strcmp, strlen, strcat 사용방법을이해다차원배열을이해배열의초기화방법을이해문자열을배열원소로사용하는방법을이해
과제 26 주소록작성 이름과 Cellular Phone 전화번호로구성된주소록작성 5명의이름과전화번호는미리초기화최대 20의이름과번호추가기능이름과전화번호 list 기능이름으로검색기능이름으로정렬기능 help 기능 Bonus: 이름삭제기능, 전화번호로정렬, 전화번호로검색
과제 : template 27 #include <string.h> // 자료구조초기화 #define MAX_ENTRY 25 #define MAX_CHARS 20 char address[max_entry][2][max_chars] = " 유비 ", "011-111-1111", " 관우 ", "017-111-1111", " 장비 ", "016-111-1111", " 조자룡 ", "011-777-7777", " 제갈량 ", "019-111-1111", ; int current_index = 5; // 내부함수 int addr_add(); // 정상적인경우 0 복귀, 문제발생의경우 -1 복귀 int addr_help(); int addr_sort(); int addr_list(); int addr_search();
과제 : template 28 // 메인함수 main() char cmd[20]; printf("my address program\n"); while (1) printf("enter any command (help to show commands) : "); gets(cmd); if (!strcmp(cmd, "quit")) printf("have a nice day..\n"); break; else if (!strcmp(cmd, "help")) addr_help(); else if (!strcmp(cmd, "sort")) addr_sort(); else if (!strcmp(cmd, "list")) addr_list(); else if (!strcmp(cmd, "add")) addr_add(); else if (!strcmp(cmd, "search")) addr_search(); else printf(" 잘못된명령어입니다 \n"); addr_help();