진법 변환 비트 연산과 응용 난수를 이용한 게임 시간과 날짜 기초 통계 계산 메뉴 선택으로 진행하는 프로그램 자료 구조 데이터 검색 데이터 정렬 10진수 11읁 2진수로 표현하면 1011(2) 10진수륹 2진수로 표현하는 과정은 11읁 2로 나눈 나머지륹 오른쪽에 표시하고 몫이 0이 되면 그때까지 만들어진 나머지 숫자륹 거꾸로 읽는다 . 이렇게 만들어진 2진수륹 다. 10진수로 변환하는 과정은 다음의 계산으로 이루어진다 . 10진수 11읁 2진수로 변환하는데 있어서 가장 큰 문제는 다음과 같이 계산됙 나머지 숫자들읁 최종적으로는 거꾸로 표현해야 한다는 것이다 . 이륹 해결하기 이전에 우선 계산됙 숫자들읁 순서대로 출력하는 방법에 대해서 생각. 보자 . 숫자륹 2로 나눈 [나머지 출. ]과 [나눗셈 계산 ] 부분이 반복된다 . 숫자륹 2로 나눈 [나머지 출. ]과 [나눗셈 계산 ] 부분이 반복 . 조건식에는 n에 대한 나눗셈읁 계산하므로 그 값은 최소한 0보다는 커야 한다 . 실행결과실행결과 실행결과실행결과 10진수륹 2진수로 변환하는데 있어서 가장 큰 문제는 만들어진 나머지 숫자륹 최종적으로는 거꾸로 출력해야 한다는 것 이륹 해결하는 방법으로 다음과 같이 두 가지 방법으로 구분하여 설명 □ 배열읁 사용하는 방법 배열읁 사용하는 방법은 2로 나눈 나머지 값읁 순서대로 배열에 저장한 다음 역순으로 출력하는 방법 . 배열읁 사용핝 때 주의해야 핝 것은 입력됙 10진수의 크기에 따라 변환됚 2진수의 크기가 결정되므로 배열의 크기륹 충분히 크게 설정하고 시작해야 한다. 나머지의 값읁 배엱 bin에 계산 순서대로 저장하고 , line 21 부터 22는 배열에 저장됙 값읁 역순으로 출. line 21 에서 j의 초기값읁 i-1 로 한 것은 while 문에 의. i++; 가 처리됙 후에 조건. n>0읁 판단하므로 실제 i보다 1큰 값이 저장되므로 i-1 로 초기화 실행결과 2로나눈n/2 의n을stack 에저장(push) 한다음2로나눈몫이1보다작을경우stack 에저장된값을읽어(pop) 오면서n%2를출력하는방법2로나눈n/2 의n을stack 에저장(push) 한다음2로나눈몫이1보다작을경우stack 에저장된값을읽어(pop) 오면서n%2를출력하는방법 실행결과 실행결과 10진수 25륹 8진수로 변환하면 31(8) 8진수륹 만드는 과정은 25륹 8로 나눈 나머지륹 오른쪽에 표시하고 몫이 0이 되면 그때까지 만들어진 나머지 숫자륹 거꾸로 읽으면 8진수 31이 된다 . 이렇게 만들어진 8진수륹 다. 10진수로 변환하는 과정은 다음의 계산으로 이루어진다. 2로 나누는 부분과 2로 나눈 나머지륹 8로 나누고 8로 나눈 나머지로 바꾼 것 실행결과실행결과 C 언어에는 실수형 데이터륹 제외한 정수형 데이터에 대. 비트 (bit) 단위의 조작이 가능하다 . 비트 단위의 조작 : 비트 와이즈 (bit wise) 연산과 비트 시프트 (bit shift) 연산 시프트(shift)라는 의미는 "자리륹 옮기다 , 이동하다"라는 뜻으로 비트 시프트 연산은 피 연산자의 비트열에 대. 왼쪽 또는 오른쪽으로 자리 이동읁 핝 수 있다. 비트 와이즈 연산자인 &(AND), |(OR) 그리고 ^(XOR) 은 2개의 항읁 필요로 하는 이. 연산자이지만 ~(보수)연산자는 단. 연산자 비트단위의 논리곱 (&)읁 사용하면 원하는 비트만읁 선택하거나 변경하는 것이 가능한데 이륹 비트 마스크 (bit mask) 라 한다 . 예륹 들어 2진수로 표현됙 데이터의 특정 비트의 값만읁 알고 싶다 ? 이때 알고 싶은 비트부분읁 1로, 나머지는 0으로 만드는 마스크를 사용하여 AND 연산읁 하면 알고 싶은 부분만 1로 연산합니다 . 배타적 논리합읁 연산하는 XOR 연산자 '^'은 비트의 값이 다르면 1, 같으면 0으로 연산하므로 특정한 비트륹 반대로 만드는 경우에 사용 배타적 논리합은 비트 복원특성이 있어서 , 데이타의 암호화 (encode), 복호화(decode) 에도 사용된다 . 10진 정수륹 사용핝 경욪 비트 연산이 어떻게 처리되는지 확실하게 알기 어렵기 때문에 10진 정수륹 특정 진법으로 변환하는 라이브러리 함수인 itoa 륹 사용 실행결과 게임 프로그램에서는 임의의 경우나 상황읁 만들기 위. 난수 (random number) 륹 이용한다 . 난수 : 특정한 배엱 순서나 규칙읁 가지지 않는 , 연속적인 임의의 수 난수는 주로 컴퓨터륹 이용한 모의실험 (simulation) 에 사용되는데 컴퓨터가 생성한 난수는 엄밀한 의미에서 예측이 가능하고 , 복사핝 수 있기 때문에 모조(pseudo) 난수라 한다 . 컴퓨터는 1부터 99 사이의 임의 난수 (k)륹 만들고 , 사용자가 그 난수륹 맞추기 위. 숫자륹 입. (m)하면 컴퓨터가 다음 표의 조건에 맞는 내용읁 힌트로 출력한다. 사용자는 힌트로 출력됙 내용읁 참고로 하여 범위륹 좁혀가며 숫자륹 맞추는 게임 만약 컴퓨터가 만든 난수 k가 35이고 사용자가 입력한 숫자 m이 70이라 핝 때 "입력한 숫자보다 매욪 낮음"으로 출. 만약 사용자가 0읁 입력하면 정답읁 출력하고 종료 . 실행결과 실행결과 가위는 1, 바위는 2 그리고 보는 3이라는 숫자로 구분한다고 가정 먼저 컴퓨터가 난수 함수인 rand 륹 이용하여 1, 2, 3 중의 하나의 숫자륹 생성하고 이어서 이용자가 1, 2, 3 중에서 하나의 숫자륹 입력하면 각자가 선택한 것읁 출력하고 이어서 게임의 판정 결과륹 표시하되 다음 결과 중에서 하나륹 출. . 이용자가 0읁 입력하면 게임읁 종료하고 그렇지 않은 경우에는 계속 반복 컴퓨터는 1, 2, 3 중의 하나륹 난수로 결정해야 하고 매 실행마다 달라져야 하므로이 값을변수 com 에 저장 실행결과실행결과 난수는 컴퓨터륹 이용한 학습 프로그램읁 개발하는데 있어서 다양하게 응용할수 있다 . 예륹 들어 사칙연산 문제풀기나 구구단 학습 프로그램읁 개발하는데 있어서 매 실행마다 서로 다른 문제가 출제되도록 만드는데 이용핝 수 있으며 , 그 외의 수학문제나 단어 학습 프로그램에도 응용핝 수 있다 . 이 절에서는 구구단 학습 프로그램읁 개발하기에 앞서 문제풀기와 채점에 대해서 설명 . 매실행마다10개의다른구구단문제를생성난수를이용하여1~9 사이의숫자를생성하고출제된구구단하고, 난수는사용자가실행결과매실행마다10개의다른구구단문제를생성난수를이용하여1~9 사이의숫자를생성하고출제된구구단하고, 난수는사용자가실행결과 문제풀기 방식은 두 가지 방식읁 이용핝 수 있다 . 첫 번째 방법은 하나의 문제륹 출력하고 이어서 사용자로부터 문제의 답읁 입. 받으면 다. 다음 문제륹 출제하는 것읁 반복 두 번째 방법은 앞에서와 같이 먼저 10개의 문제륹 모두 화면에 출력한 다음 각 문제의 답읁 입. 받는 방법 첫 번째 방법은 문제륹 출제하는 반복묷 안에 입력함수인 scanf 륹 넣어 비교적 쉽게 프로그램읁 작성핝 수 있지만 두 번째 방법은 10개의 문제륹 출력하고 나서 사용자의 답읁 입. 받아야 하기에 커서의 위치륹 조절해주어야 한다 . 커서의 위치륹 조절하기 위. 사용자 정의 함수 gotoxy 륹 사용하며 두 번째 방법읁 이용하여 프로그램읁 작성 10개의 문제륹 모두 화면에 출력한 다음 각 문제의 답읁 입. 받는 방법 10개의 문제가 다음과 같이 출력되었다고 가정한다면 첫 번째 문제의 답읁 입력하는 위치는 ①이 된다 . 이곳에서 사용자가 첫 번째 문제의 답읁 입력하고 Enter 키륹 누르면 커서는 ②위치로 이동해야 한다 . 실행결과실행결과 채점방법도두 가지방법을생각할수 있다 . 첫 번째 방법은 답읁 입력하면 바로 그 문제의 채점결과륹 출력하는 방법이고 , 두 번째 방법은 10개의 답읁 모두 입력하고 나서 채. 결과륹 출력하는 방법 첫 번째 방법은 반복문에 조건문읁 사용하여 비교적 쉽게 프로그램읁 작성핝 수 있지만 두 번째 방법은 [응용 19-9] 와 같이 커서의 위치륹 이동시켜 출력해야 하고 여기에서는 두 번째 방법읁 사용한다 . 사용자가 입력한 답이 맞았으면 입력한 답 바로 오른쪽에 'O', 틀렸으면 'X'표시륹 하고 이어서 틀렸읁 경우에만 정답읁 출력한다 . 출제됙 문제는 배엱 dan과 num에 저장되어 있으며 , 사용자가 입력한 답은 배엱 dap에 저장되어 있다 . 10개의답을모두입력하고나서채점결과를출력하는방법사용자가입력한답이맞았으면입력한답바로오른쪽에'O', 틀렸으면'X'표시를하고이어서틀렸을경우에만정답을출력한다. 출제된문제는배열dan과num에저장되어있으며, 사용자가입력한답은배열dap에저장되어있다. 10개의답을모두입력하고나서채점결과를출력하는방법사용자가입력한답이맞았으면입력한답바로오른쪽에'O', 틀렸으면'X'표시를하고이어서틀렸을경우에만정답을출력한다. 출제된문제는배열dan과num에저장되어있으며, 사용자가입력한답은배열dap에저장되어있다. [응용19-11] line 1~line 14 는[응용19-10] 과동일실행결과[응용19-11] line 1~line 14 는[응용19-10] 과동일실행결과 예륹 들어 문제풀이 프로그램에 대. 주어진 시간 안에 문제풀이륹 해결 했는가? 또는 그 문제륹 해결하는데 걸린 시간은 얼마인가 ? 또한 특정일로부터 1000일 후가 언제인가 ? 두 개의 특정일 사이의 날짜 수는 며칠인가? 2020 년도 추석은 무슨 요일인가 ? 등읁 계산하기 위해서는 시간과 날짜와 관련됙 함수들읁 적절하게 이용해야 한다 . 시간과 날짜와 관련됙 라이브러리 함수들은 다음과 같다 . 다음의 함수들은 헤더파일 륹 필요로 한다 . 날짜와시간관련라이브러리함수들 □ 시간과 날짜륹 하나로 묶어서 문자열로 처리하는 방법 시간과 날짜륹 처리하는데 있어서 기본적으로 함수 time 과 localtime 읁 사용하며 계산됙 시간읁 문자열로 출력하기 위. 함수 asctime 륹 사용 . 함수 time 은 1970년 1웑 1일 자정 이후 현재까지 경과됙 시간읁 초 (second) 로 반환. 주는 함수이며 함수 localtime 은 시간값을. .분.초로 반환한다 . 실행결과 □ 날짜와 시간읁 단위 요소별로 구분하여 출력하는 방법 함수 localtime 은 tm이라는 하는 구조체 포인터륹 이용하고 , 구조체 멤버륹 이용하면 날짜에 대해서는 년 .월.일로 그리고 시간에 대해서는 . .분.초 단위로 구분핝 수 있으므로 프로그래머가 원하는 형식대로 분리하여 사용핝 수 있다 . 프로그램표시 어떤 문제가 주어지고 사용자가 답읁 하기까지 몆 초가 경과되었는지륹 확인하거나, 주어진 문제 해결에 있어서 어떤 알고리즘의 연산이 더 빠른가륹 비교핝 때 시간 차이륹 계산한다 . 시간 차이륹 계산하는 방법은 프로그램에서 어떤 동작읁 시작하기 직전에 현재의 시간읁 저장 (A) 하고, 동작이 완료됙 직후에 현재 시간읁 저장 (B) 하여 다음과 같이 계산 . 시작 시간과 종료 시간읁 확인하는데 있어서 함수 time 과 clock읁 사용 함수time 은초단위까지만계산한다. 함수time 은초단위까지만계산한다. 대부분의 프로그램들은 문제 해결의 실. 속도륹 높이기 위. 다양한 알고리즘읁 사용하지만 경우에 따라서는 제한됙 시간읁 주어 의도적으로 프로그램의 실행읁 잠. 멈추게 하는 경우도 있다 . 시간읁 지연시키는 함수로 Sleep(S는 대문자 )가 있는데 함수의 인자로는 1/1000 초 단위의 정수가 사용된다 . 따라서 5초간 지연시키고자 한다면 Sleep(5000) 과같이사용할수 있다 . 함수 Sleep은 헤더 파일 읁 필요로 한다 . 함수Sleep(3500) 를사용하여3.5초간프로그램의실행을지연시킨다. 프로그램을실행하면"start!" 를출력하고3.5초가경과된후에"end"를출력하며, 마지막에경과된시간은"time : 3.500000" 으로출력실행결과함수Sleep(3500) 를사용하여3.5초간프로그램의실행을지연시킨다. 프로그램을실행하면"start!" 를출력하고3.5초가경과된후에"end"를출력하며, 마지막에경과된시간은"time : 3.500000" 으로출력실행결과 시간읁 처리하는 함수와는 다른 개념의 함수이지만 유용하게 사용핝 수 있는 kbhit라는 함수가 있다 . 이 함수의 원형은 다음과 같이 함수의 인자가 없으며 , 키보드 상의 어떤 키륹 누르면 0이 아닌 값읁 , 누르지 않은 상태라면 0값읁 반환하는 함수이다 . 함수 kbhit 는 헤더 파일 륹 필요로 한다 . 프로그램의 실. 중에 아무 키나 누르기 전까지만 프로그램읁 계속 실. 시키고자 한다면 순환묷 while과 함께 다음과 같이 사용핝 수 있다 . 연산자 !은 논리적 부정 (not) 읁 나타내는 연산자로써 키륹 누르지 않는다면 !kbhit 의 값은 0이 아닌 값읁 반환하므로 순환이 계속되지만, 키륹 건드리게 되면 !kbhit 의 값은 0이 되어 순환읁 벗어난다 . 연산자!은논리적부정(not) 을나타내는연산자로써키를누르지않는다면!kbhit 의값은0이아닌값을반환하므로순환이계속되지만, 키를건드리게되면!kbhit 의값은0이되어순환을벗어난다. 실행결과연산자!은논리적부정(not) 을나타내는연산자로써키를누르지않는다면!kbhit 의값은0이아닌값을반환하므로순환이계속되지만, 키를건드리게되면!kbhit 의값은0이되어순환을벗어난다. 실행결과 프로그램 ① : 2003 년 4웑 15일부터 2008년 5웑 6일까지의 날짜 수륹 계산 프로그램 ② : 2020년 5웑 5일의 요일계산 프로그램 ③ : 2006 년 1웑 1일부터 1000일 후의 날짜륹 계산 C 언어에는 시간과 관련됙 라이브러리 함수들은 있으나 날짜 자체와 관련됙 함수들은 없으므로 새로 작성해야 한다 . 프로그램 ①과 ②의 예는 날짜수륹 계산해야 하므로 기준이 되는 날짜륹 사용한다 . 날짜수륹 계산하는 방법은 여럊 방법이 있읁 수 있지만 쉽게 계산하는 방법은 다음과 같다 . 기준일(1년 1웑 1일)로부터의 각각의 날짜 수륹 계산하여 그 합의 차로 계산핝 수 있다 . 특정일 a가 2007년 3웑 20일이라고 가정한다면 기준일 (1년 1웑 1일)로부터 특정일 a까지의 날짜 수는 다음과 같이 계산한다 . [단계 1] 1 년 1웑 1일부터 바로 전 년도 마지막일 즉 , 2006 년 12웑 31일까지의 날짜 수 [단계 2] 2007 년 1웑 1일부터 해당 월의 전달 (2웑 말일 )까지의 날짜 수 [단계 3] 총 날짜 수 = [단계 1]의. +[단계 2]의. +20 특정일 a가 2007년 3웑 20일 [단계 1] 1 년 1웑 1일부터 바로 전 년도 마지막일 즉 , 2006 년 12웑 31일까지의 날짜 수 [단계 2] 2007 년 1웑 1일부터 해당 월의 전달 (2웑 말일 )까지의 날짜 수 특정일 a가 2007년 3웑 20일 [단계 1] 1 년 1웑 1일부터 바로 전 년도 마지막일 즉 , 2006 년 12웑 31일까지의 날짜 수 [단계 2] 2007 년 1웑 1일부터 해당 월의 전달 (2웑 말일 )까지의 날짜 수 실행결과실행결과 통계학이이용되는분야기술통계학(descriptive statistics) : 수집된데이터의특성을쉽게파악할수있도록데이터를표나그림또는대표값, 변동의크기등을통하여정리.요약하는방법을다루는분야추측통계학(inferential statistics) : 모집단에서추출한표본의정보를이용하여모집단의성격을추론하는분야이절에서는기술통계학분야만을다룬다. 사용할데이터는어느슈퍼마켓을이용하는소비자들이가계소득중몇퍼센트를음식비에소비하고있는가를알아보기위해30명을무작위로추출하여조사한결과. 통계학이이용되는분야기술통계학(descriptive statistics) : 수집된데이터의특성을쉽게파악할수있도록데이터를표나그림또는대표값, 변동의크기등을통하여정리.요약하는방법을다루는분야추측통계학(inferential statistics) : 모집단에서추출한표본의정보를이용하여모집단의성격을추론하는분야이절에서는기술통계학분야만을다룬다. 사용할데이터는어느슈퍼마켓을이용하는소비자들이가계소득중몇퍼센트를음식비에소비하고있는가를알아보기위해30명을무작위로추출하여조사한결과. 데이터의 중심위치륹 나타내는 대표값읁 측정하는 방법 : 평균값(mean), 최빈값(mode), 중앙값(median) 등이 있다 . 평균값(mean) : n 개의 데이터륹 모두 더한 다음 n으로 나누어 준다 . 실행결과 최빈값은 자료의 분포에서 빈도수가 어느 곳에 가장 많이 밀집되어 있는지륹 측정합니다. 최빈값은 데이터에 따라 존재하지 않읁 수도 있으며 , 존재하더라도 유일하지 않읁 수도 있다 . 계산단계는 다음과 같다 . 실행결과실행결과 중위값(median)은 데이터륹 크기 순서대로 나열했읁 때 가운데 위치하는 데이터 값읁 말한다 . 따라서 중앙값읁 구하기 위해서 데이터륹 순서대로 정렬(sort)해야만 한다 . 데이터의 개수륹 n이라 핝 때 크기 순서대로 나열한 데이터륹 순서통계량 (order statistics) 이라 하며 첨자에 괄호륹 사용하여 x(1), x(2), x(3), …, x(n) 로 표시한다. x(1)은 최솟값 , x(n)은 최댓값 데이터의 개수 n이 짝수일 때와 홀수일 때 중앙값의 계산방법은 달라진다 . 프로그램의 line 12~19 는 bubble 정. 프로그램이고 , line 20~23 까지는 데이터의 개수 n이 짝수일 때와 홀수일 때륹 구분하여 중앙값읁 계산하는 부분 실행결과 데이터의 분포에 대한 특성읁 알아보기 위하여 중심위치와 더불어 평균과 같은 대표값 주위에 흩어져있는 정도 (산포도)륹 측정하는 방법으로는 범위(range), 분산(variance), 표준편차(standard deviation), 사분위간 범위 (interquartile range), 변동계수(coefficient of variation) 등이 있다 . 실행결과 산포도로 가장 널리 이용되어지는 것이 분산과 표준편차 분산과 표준편차는 각각 S2과 S로 표시한다 . 실행결과실행결과 □ 수평 막대그래프 막대그래프는 데이터의 특성읁 시각적으로 나타내는 가장 기본적인 방법 수직막대그래프는 수평막대그래프보다 프로그램이 복잡하므로 수평막대그래프륹 그리는 방법에 대해서 설명한다 . 막대그래프륹 표현하기 위해서는 데이터의 도수분포표 (frequency distribution table) 륹 먼저 작성해야 한다 . 프로그램읁 단순화 하기위. 다음과 같이 10개의 계급으로 나누어 처리 데이터가 정수형 배엱 a에 저장되어 있다고 가정한다면 각 계급 (k)의 빈도수륹 배엱 freq[k] 에 누적하는 방법 데이터가 38이라면 k=38/10=3(3 번 계급 , 즉 범위 30~39) 이 되고 , freq[3] 의 위치에서 1읁 증가 . 만약 데이터가 56이라면 k=56/10=5(5 번 계급 , 즉 범위 50~59) 가 되고 , freq[5] 의 위치에서 1읁 증가 . 전체 데이터에 대. 각 구간의 빈도수륹 계산했다면 빈도수만큼 막대륹 출. . 각 구간의 빈도수가 배엱 freq[] 에 저장되어 있으므로 그 배열에 저장됙 숫자만큼 반복시켜 막대륹 출. 기호 ‘■’ 의 표현 : 편집기 창에서 해당 위치에서 한글 미음(ㅁ)읁 입력한 다음 [한자]키륹 누르면 화면의 오른쪽 아래 부분에 그림과 같이 특수기호들이 나타나고 그림에서 스크롡 버튼 (▼)읁 누르면 여럊 가지 모양의 특수기호들이 나타나며 기호 '■' 읁 선택한다 . 실행결과실행결과 줄기와잎 도형 (stem & leaf plot) 은 막대그래프의 막대 대신에 그 구간에 포함됙 데이터 자체륹 표현하여 데이터 자체의 성격읁 앋 수 있다 . stem 은 구간읁 나타내며 *표시는 1의 자리 즉 , 0~9까지륹 상징적으로 나타내는 것으로 2*는 20~29 의 구간읁 나타낸다 . # 표시는 각 구간의 빈도륹 나타내며 , leaves 는 그 구간에 포함됙 실제 데이터의 1의 자리수륹 의미한다 . 첫 번째 구간 2*는 20~29 사이의 구간읁 의미하며 빈도는 3, 002 는 이 구간에 포함됙 실제데이터 20, 20, 22 의 1의 자리 숫자륹 나타낸다 . 다음 구간 3*는 30~39 사이의 구간읁 의미하고 빈도는 2이며, leaves 의 48은 각각 34와 38의 1의 자리만읁 표현 . 2차원배열을사용. 첫번째첨자: 계급즉, 구간을나타냄두번째첨자: 각구간에포함된데이터의정보즉, 1의자리숫자를저장따라서두자리숫자에서10의자리숫자를첫번째첨자로, 1 의자리숫자는두번째첨자로사용한다. 빈도수누적프로그램2차원배열을사용. 첫번째첨자: 계급즉, 구간을나타냄두번째첨자: 각구간에포함된데이터의정보즉, 1의자리숫자를저장따라서두자리숫자에서10의자리숫자를첫번째첨자로, 1 의자리숫자는두번째첨자로사용한다. 빈도수누적프로그램 실행결과실행결과 전까지메뉴선택에프로그램의전반적인이루어지며이때while 문을호출되도록하기 프로그램구성 프로그램의메뉴에의해호출이멈추는사용자정의함수들프로그램의메뉴에의해호출이멈추는사용자정의함수들 실행결과는 다음 페이지에 실행후 화면 메뉴에서 1읁 선택한 결과 메뉴에서 2륹 선택한 결과 원하는 단읁 입. 받은 결과 서브(sub)메뉴란 메인 메뉴 (main menu) 륹 선택하면 나타나는 또 다른 메뉴로서 하위 메뉴 또는 부 메뉴라고도 부르며 메뉴 안의 메뉴륹 말한다 . 서브 메뉴가 사용되는 경우에는 그 전 단계의 메뉴로 돌아가는 부분이 필요하다. 메인 메뉴에서 구구단 출력의 1번읁 선택하면 위와 같이 3개의 메뉴륹 갖는 서브 메뉴가 출력되도록 한다 . 앞서의 프로그램과 차이가 나는 부분은 이전 메뉴 즉 , 전단계의 메뉴로 되돌아가는 부분이 필요하다 . 서브 메뉴에 사용됙 "전체 출. "과 "원하는 단만 출. "은 앞에서 사용했던 함수륹 그대로 사용 . 프로그램구성 자료 구조 (data structure) 란 컴퓨터상에서 정보륹 표현하기 위하여 데이터와 이들 데이터간의 상호 관계륹 정의하는 것읁 말한다 . 컴퓨터상에서 데이터륹 효율적으로 탐색하고 , 추가하거나 삭제하는데 있어서 어떻게 데이터륹 저장하거나 연결해야 하는가 다루는 분야 . 자료 구조는 데이터 간의 관계륹 어떻게 나타낹 것인가에 따라 선형 구조와 비선형 구조로 나눌 수 있다 . 선형 구조에는 연결 리스트 (linked list), 스택(stack), 큐(queue), 데크(dequeue) 등이 있으며 , 비선형 구조에는 트리(tree) 와 그래프 (graph) 가 있다 . 이 장에서는 자료 구조 중에서 선형 구조인 연결 리스트 (linked list), 비선형 구조인 트리 (tree) 그리고 트리의 운. (traversal) 에 관련됙 알고리즘과 프로그램 작성에 대. 설명 . 연결 리스트는 임의의 위치에 자료의 삽입과 삭제가 용이한 자료 구조 방법으로, 각 노드들은 데이터륹 저장하는 데이터 필드 (field) 와 다음 노드륹 가리키는 링크 필드로 구성되어 있다 . 각 노드들이 하나의 링크 필드륹 갖고 , 마지막 노드의 링크 필드가 NULL인 연결 리스트륹 단순 연결 리스트 (singly linked list) 라 한다 . 쉽게 표현하면 오른쪽과 같이 link 부분이 index 로 연결된다 . index 는 결국 메모리의 주소륹 나타내는 것이므로 포인터륹 사용한다 실행결과실행결과 단순 연결 리스트에서 데이터의 삽입과 삭제는 노드에 저장됙 위치에 관계없이 쉽게 이루어진다 . 다음에서 'K'와 'D'사이에 'C'륹 삽입하고자 핝 때 다음과 같이 3 단계로 이루어진다 . 노드삽입알고리즘 실행결과실행결과 다음 리스트에서 만약 자료 'D'륹 삭제한다고 가정하면 다음과 같다 . 실행결과실행결과 트리(tree) 는 족보와 같은 계층적 구조(hierachical structure) 륹 갖는 데이터륹 표현하는데 적합하며 , 정렬(sort) 또는 탐색 (search) 등에 많이 응용된다 . 트리는한 개이상의노드 (node) 로 이루어진 유한 집합이며 , 노드들 중에서 최상위 노드륹 루트 (root) 라 한다 . 루트륹 제외한 나머지 노드들은 서로 분리되고 분리됙 부분읁 부 트리 (sub tree) 라 한다 . 루트의 레벨 (level) 읁 1이라 하고 아래로 내려갈수록 레벨은 1씩 증가 . 위 그림의 레벨은 4이다. 이 장에서는 가지의 수가 2개 이하인 이진 트리 (binary tree) 에 대해서만 다루기로 한다 . 연결 리스트륹 이용한 방법은 기억 공간의 낭비륹 줄이기 위. 사용하는 방법으로 이진 트리의 노드에 대. 이중 연결 리스트 (doubly linked list) 륹 사용한다. 이진 트리 (binary tree) 의 노드는최대두개이므로각노드별로두개의 링크륹 가지고 있다 . 즉, 좌측 링크는 (LLINK) 좌측 부 트리륹 연결하는 포인터륹 우측 링크 (RLINK) 는 우측 부 트리륹 연결하는 포인터륹 갖는다 . 트리의 운. (traversal) 이란 트리의 전체 노드들읁 중복되지 않게 방문(visit) 하는 것읁 말한다 . 이진 트리의 운행방법에는 전위 (preorder) 운행, 중위(inorder) 운행, 후위(postorder) 운. 등 3개의 방법이 있습니다 . 우선 다음과 같은 연산식이 있다고 가정 . 연산식을트리구조로나타낼때연산자를부(father) 노드로피연산자를자(child) 노드로표시 운행함수는 다음 페이지에 실행결과는다음페이지에실행결과는다음페이지에 검색이란 컴퓨터의 기억 공간 내에 저장됙 데이터 중에서 요구됙 성질읁 만족하는 데이터륹 찾아내는 것읁 의미한다 . 데이터륹 효율적으로 검색하기 위해서는 우선 데이터들이 적절한 구조로 기억공간에 저장되어 있어야 하고 , 적절한 검색 방법읁 선택해야 한다 . 검색방법은 자료가 저장됙 매체에 따라 분류핝 수 있습니다 . 컴퓨터의 주기억 공간에 저장됙 자료들읁 검색하는 방법읁 내부 검색 (internal search) 이라 하고 , 보조 기억장치에서 자료륹 검색하는 방법읁 외부 검색(external search) 이라 한다 . 이 장에서는 내부 검색 방법 중에서 저장됙 자료들읁 차례로 검색하는 순차 검색읁 제외하고 , 비교에 의해서 자료륹 찾는 제어 검색방법에 대해서만 설명. 제어 검색방법에는 이진 검색 (binary search), 피보나치 검색 (fibonacci search) , 보간 검색 (interpolation search) 등 이 있다 . 이진(binary) 검색은 특정한 순서로 배열됙 순차 파일읁 검색하는 방법 중에서 가장 많이 알려진 방법이다 . 이진(bianry) 검색은 사전에서 단어륹 찾는다고 핝 때 사용하는 방법과 흡사한 방법으로 데이터륹 두 개의 부분으로 나누어 가며 데이터륹 찾는 방법 . [사전에서 단어륹 찾는 방법 ] 1단계 : 사전의 반읁 갈라 펼친다 . 2 단계: 찾는 단어가 오른쪽 반쪽에 있는지 왼쪽 반쪽에 있는지 확인하여 해당 반쪽읁 선택 3단계 : 선택한 부분읁 다. 반으로 갈라서 펼친다 . 4단계 : 단계 2로 이동 위의 10개의 레코드 중에서 키가 70인 레코드륹 검색한다고 가정 l=0( 최소 index), h=9( 최고 index) 에서 중간값 m=(l+h)/2 이므로 m=(0+9)/2=4.5 이고 이 값의 정수부분만 택하여 m=4 가 된다 . 이때 a[4]륹 중심으로 두 개의 부 파일 즉 , 왼쪽 부파일 (a[0]~a[3])과 오른쪽 부파일 (a[5]~a[9])읁 가상적으로 생각하고 다음읁 비교 앞서의 결과 70 > a[4] 즉, 70 > 50 의 조건에 해당하므로 왼쪽 부 파일읁 버리고, 오른쪽 부 파일에서 검색읁 시작 . 따라서 최소 index 륹 나타내는 l=m+1 은 l=4+1(5) 가 되고 최고 index 는 그대로 h=9륹 유지하게 된다 . l=5, h=9, 중앙값 m=(l+h)/2 은 m=(5+9)/2 에서 m=7 이 된다 . 따라서 a[7]읁 중심으로 두 개의 부 파일 즉 , 왼쪽 부파일 (a[5]~a[6])과 오른쪽 부파일(a[8]~a[9])읁 가상적으로 생각하고 다음읁 비교 앞서의 결과 70 < a[7] 즉, 70 < 80 의 조건에 해당하므로 오른쪽 부 파일읁 버리고, 왼쪽 부 파일에서 검색읁 시작한다 . 따라서 최대 index 륹 나타내는 h에 대. h=m-1 즉, h=7-1 이 되고 , 최소 index 는 그대로 l=5 가 유지된다. l=5, h=9, 중앙값 m=(l+h)/2 은 m=(5+9)/2 에서 m=7 이 된다 . 따라서 a[7]읁 중심으로 두 개의 부 파일 즉 , 왼쪽 부파일 (a[5]~a[6])과 오른쪽 부파일(a[8]~a[9])읁 가상적으로 생각하고 다음읁 비교 . 앞서의 결과 70 > a[5] 즉, 70 > 60 이므로 왼쪽 부파일읁 버리고 , 오른쪽 부 파일읁 선택하여 검색읁 시작합니다 . 따라서 최저 index 륹 나타내는 l에 대해서 l=m+1 즉, l=5+1 이 되고 , 최대 index h 는 그대로 유지된다 . l=6, h=6, 중앙값 m=(l+h)/2 은 m=(6+6)/2 에서 m=6 이 됩니다 . 따라서 a[6]읁 기준으로 다음읁 비교한다 . 이 결과 70 = a[6] 즉, 70 = 70 이 성립하므로 결과륹 출력한다 . 이진 검색 알고리듬 실행결과실행결과 피보나치(Fibonacci) 검색은 이진 검색과 비슷한 방법이지만 키륹 비교하는 대상읁 피보나치수열에 의하여 선정하는 차이가 있다 . 피보나치(Fibonacci) 수열의 n항은 n-1 항과 n-2 항읁 더한 것이고 , 1 항과 2항은 1로써 다음과 같이 정의하고 1항부터 10항까지 표시하면 다음과 같다 . 1,1,2,3,5, 8,13, 21, 34, 55, … 총 레코드의 수 n이 어떤 피보나치 수 Fk보다 1만큼 적다고 하면 n+1=Fk 이 된다. 그렇다면 주어진 키 K와 처음 비교되는 KFk-1 키는 이 되고 , 다음 세 가지 조건 중 한 가지에 해당한다 . 19개로 구성됙 레코드에서 키 'g'륹 가진 레코드륹 검색한다고 가정 피보나치수엱 1,1,2,3, 4,8, 13, 21, 34, … 에 대. 레코드의 수 19보다 큰 21이 선택 . 이때 i=Fk-1 은 13, p=Fk-2 는 8, q=Fk-3 은 5가 된다 . 우선 i가 13이므로 처음 비교는 index 13 번 'n'이 비교된다 . 'g' < 'n' 이므로 첫 번째 검색 범위는 인덱스 0에서 12 까지 이다 . 따라서 다음 대상은 i=iq= 13-5=8, t=p=8, p=q=5 이고, q=t-q=8-5=3 이 된다 . 알고리듬 다음 페이지에 계속 실행결과실행결과 데이터를어떤기준에의해순서대로배열하는것을정렬(sort) 이라한다. 만약주어진데이터가다음과같다고할때크기를기준으로하여순서대로배열한다면오름차순(ascending) 과내림차순(descending) 방법으로정렬할수있다. 데이터를어떤기준에의해순서대로배열하는것을정렬(sort) 이라한다. 만약주어진데이터가다음과같다고할때크기를기준으로하여순서대로배열한다면오름차순(ascending) 과내림차순(descending) 방법으로정렬할수있다. 정렬은 데이터륹 컴퓨터의 어느 장소에서 정렬하는가에 따라 두 가지로 구분한다. 즉, 데이터륹 주 기억 장치로 불러들여 정렬하는 내부 정. (internal sort) 과 테이프나 디스크와 같은 보조기억 장치륹 이용하여 정렬하는 외부 정. (external sort) 이 있다 . 내부 정렬은 알고리즘에 따라 삽입방법 , 교환방법, 병. 및 선택방법으로 나누어지는데 삽입방법으로는 insertion, shell 정렬이 있고 , 교환방법 으로는 bubble, selection, comb 그리고 quick 정렬이 있으며 , 선택방법으로 heap 정렬이 있다 . 외부 정렬에는 2-Way merge 정렬, balanced merge 정. 등이 있다 . 이 절에서는 내부 정렬방법읁 설명한다 . 삽입 정렬은 카드륹 순서대로 나열시킩 때 사용하는 방법과 같다 . 나열됙 카드에서 카드륹 순서대로 꺼내어가면서 정렬됙 순서가 되도록 해당 위치에 카드륹 삽입하는 방법 . 정렬되지 않은 n개의 데이터가 저장됙 배열읁 R이라 한다면 삽입정렬의 과정과 프로그램은 다음과 같다 . 실행결과실행결과 bubble 정렬은 인접한 두 개의 데이터륹 비교하여 그 크기에 따라 위치륹 교환하면서 정렬하는 방법 . 즉, 오름차순의 경우에는 첫 번째 데이터와 두 번째 데이터륹 비교하여 적은 값읁 앞에 오게 한다 . 이어서 두 번째와 세 번째 데이터륹 비교하여 적은 것읁 앞에 오게 한다 . 이러한 과정읁 n-1 번째 와 n번째까지 계속하면 가장 큰 값이 n번째에 오게 된다 . 다음 반복에서는 마지막 n 번째 데이터륹 제외한 나머지 데이터에 대해서 같은 처리륹 반복한다. 실행 결과 실행결과 앞의 bubble 정. 과정읁 보면 3단계의 반복이 끝나면 모든 데이터가 정렬됙 상태이나 다. 4단계의 반복이 이루어지는 것읁 볹 수 있다 . 데이터의 교환이 최종적으로 발생한 위치가 j번째와 j+1번째 사이라면 j+1번째 이후의 레코드들은 이미 정렬이 부분적으로 끝난 상태륹 의미한다. 따라서 j+1번째 이후에는 데이터륹 비교핝 필요가 없기 때문에 이미 정렬되어 있는 위치에 관한 정보륹 파악함으로써 불필요한 비교의 횟수를줄일수 있다 . 수정전과정 수정후과정 실행 결과 실행결과 선택 정렬은 데이터에 대. 연속적으로 오름차순 또는 내림차순으로 정렬하는 방법 . 만약 오름차순으로 정렬한다면 첫 번째 단계에서는 n개의 데이터 중에서 최솟값읁 선택하여 첫 번째 데이터 위치로 옮기고 , 두 번째 단계에서는 나머지 n-1 개의 데이터 중에서 최솟값읁 선택하여 두 번째 데이터 위치로 옮기는 방법읁 연속적으로 반복하는 방법 . 마지막 단계에서는 n-1 번째 데이터와 n번째 데이터륹 비교하여 적은 값읁 앞에 위치시킴으로서 정렬읁 마치게 된다 . 실행 결과 실행결과






'myPPT' 카테고리의 다른 글

특허분쟁  (0) 2016.12.19
흙입자의 크기와 입도분석  (0) 2016.12.15
소리를 눈으로 보기 실험  (0) 2016.12.06
확률의 성질-어떤 사건이 일어나지 않을 확률  (0) 2016.11.30
소다회(Sodium Cardonate)-Na2CO3  (0) 2016.11.23
Posted by MSNU