1 / 116

19. 응용 프로그래밍

19. 응용 프로그래밍. Name Title Company Name. 학습할 내용. 진법 변환 비트 연산과 응용 난수를 이용한 게임 시간과 날짜 기초 통계 계산 메뉴 선택으로 진행하는 프로그램 자료 구조 데이터 검색 데이터 정렬. 진법 변환. 10 진수 11 을 2 진수로 표현하면 1011 (2) 10 진수를 2 진수로 표현하는 과정은 11 을 2 로 나눈 나머지를 오른쪽에 표시하고 몫이 0 이 되면 그때까지 만들어진 나머지 숫자를 거꾸로 읽는다.

laurie
Download Presentation

19. 응용 프로그래밍

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 19. 응용 프로그래밍 Name Title Company Name

  2. 학습할 내용 • 진법 변환 • 비트 연산과 응용 • 난수를 이용한 게임 • 시간과 날짜 • 기초 통계 계산 • 메뉴 선택으로 진행하는 프로그램 • 자료 구조 • 데이터 검색 • 데이터 정렬

  3. 진법 변환 10진수 11을 2진수로 표현하면 1011(2) 10진수를 2진수로 표현하는 과정은 11을 2로 나눈 나머지를 오른쪽에 표시하고 몫이 0이 되면 그때까지 만들어진 나머지 숫자를 거꾸로 읽는다. 이렇게 만들어진 2진수를 다시 10진수로 변환하는 과정은 다음의 계산으로 이루어진다.

  4. 10진수 11을 2진수로 변환 10진수 11을 2진수로 변환하는데 있어서 가장 큰 문제는 다음과 같이 계산된 나머지 숫자들을 최종적으로는 거꾸로 표현해야 한다는 것이다. 이를 해결하기 이전에 우선 계산된 숫자들을 순서대로 출력하는 방법에 대해서 생각해 보자. 숫자를 2로 나눈 [나머지 출력]과 [나눗셈 계산] 부분이 반복된다.

  5. 10진수를 2진수로 변환 숫자를 2로 나눈 [나머지 출력]과 [나눗셈 계산] 부분이 반복. 조건식에는n에대한 나눗셈을 계산하므로 그 값은 최소한 0보다는 커야 한다.

  6. 10진수를 2진수로 변환 실행결과

  7. 10진수를 2진수로 변환(함수) 실행결과

  8. 10진수를 2진수로 변환 10진수를 2진수로 변환하는데 있어서 가장 큰 문제는 만들어진 나머지 숫자를 최종적으로는 거꾸로 출력해야 한다는 것 이를 해결하는 방법으로 다음과 같이 두 가지 방법으로 구분하여 설명

  9. 10진수를 2진수로 변환(배열사용) □ 배열을 사용하는 방법 배열을 사용하는 방법은 2로 나눈 나머지 값을 순서대로 배열에 저장한 다음 역순으로 출력하는 방법. 배열을 사용할 때 주의해야 할 것은 입력된 10진수의 크기에 따라 변환될 2진수의 크기가 결정되므로 배열의 크기를 충분히 크게 설정하고 시작해야 한다.

  10. 10진수를 2진수로 변환(배열사용) 나머지의 값을 배열 bin에 계산 순서대로 저장하고, line 21부터 22는 배열에 저장된 값을 역순으로 출력 line 21에서 j의 초기값을 i-1로 한 것은 while문에 의해 i++;가 처리된 후에 조건식 n>0을 판단하므로 실제 i보다 1큰 값이 저장되므로 i-1로 초기화 실행결과

  11. 10진수를 2진수로 변환(재귀적 호출) 2로 나눈 n/2의 n을 stack에 저장(push)한 다음 2로 나눈 몫이 1보다 작을 경우 stack에 저장된 값을 읽어(pop)오면서 n%2를 출력하는 방법

  12. 10진수를 2진수로 변환(재귀적 호출)

  13. 10진수를 2진수로 변환(재귀적 호출) 실행결과

  14. 10진수를 8진수로 변환 10진수 25를 8진수로 변환하면 31(8) 8진수를 만드는 과정은 25를 8로 나눈 나머지를 오른쪽에 표시하고 몫이 0이 되면 그때까지 만들어진 나머지 숫자를 거꾸로 읽으면 8진수 31이 된다. 이렇게 만들어진 8진수를 다시 10진수로 변환하는 과정은 다음의 계산으로 이루어진다.

  15. 10진수를 8진수로 변환 2로 나누는 부분과 2로 나눈 나머지를 8로 나누고 8로 나눈 나머지로 바꾼 것

  16. 10진수를 8진수로 변환 실행결과

  17. 비트 연산과 응용 C 언어에는 실수형 데이터를 제외한 정수형 데이터에 대해 비트(bit) 단위의 조작이 가능하다. 비트 단위의 조작 : 비트 와이즈(bit wise) 연산과 비트 시프트(bit shift)연산 시프트(shift)라는 의미는 "자리를 옮기다, 이동하다"라는 뜻으로 비트 시프트 연산은 피 연산자의 비트열에 대해 왼쪽 또는 오른쪽으로 자리 이동을 할 수 있다.

  18. 비트 와이즈 연산 비트 와이즈 연산자인 &(AND), |(OR) 그리고 ^(XOR)은 2개의 항을 필요로 하는 이항 연산자이지만 ~(보수)연산자는 단항 연산자

  19. 비트 와이즈 연산(비트 마스크) 비트단위의 논리곱(&)을 사용하면 원하는 비트만을 선택하거나 변경하는 것이 가능한데 이를 비트 마스크(bit mask)라 한다. 예를 들어 2진수로 표현된 데이터의 특정 비트의 값만을 알고 싶다? 이때 알고 싶은 비트부분을 1로, 나머지는 0으로 만드는 마스크를 사용하여 AND 연산을 하면 알고 싶은 부분만 1로 연산합니다.

  20. 비트 와이즈 연산(비트 마스크) 배타적 논리합을 연산하는 XOR 연산자 '^'은 비트의 값이 다르면 1, 같으면 0으로 연산하므로 특정한 비트를 반대로 만드는 경우에 사용 배타적 논리합은 비트 복원특성이 있어서, 데이타의 암호화(encode), 복호화(decode)에도 사용된다.

  21. 비트 와이즈 연산 10진 정수를 사용할 경우 비트 연산이 어떻게 처리되는지 확실하게 알기 어렵기 때문에 10진 정수를 특정 진법으로 변환하는 라이브러리 함수인 itoa를 사용 실행결과

  22. 난수를 이용한 게임 게임 프로그램에서는 임의의 경우나 상황을 만들기 위해 난수(random number)를 이용한다. 난수: 특정한 배열 순서나 규칙을 가지지 않는, 연속적인 임의의 수 난수는 주로 컴퓨터를 이용한 모의실험(simulation)에 사용되는데 컴퓨터가 생성한 난수는 엄밀한 의미에서 예측이 가능하고, 복사할 수 있기 때문에 모조(pseudo) 난수라 한다.

  23. 컴퓨터가 생성한 정수 난수 맞추기 컴퓨터는 1부터 99 사이의 임의 난수(k)를 만들고, 사용자가 그 난수를 맞추기 위해 숫자를 입력(m)하면 컴퓨터가 다음 표의 조건에 맞는 내용을 힌트로 출력한다. 사용자는 힌트로 출력된 내용을 참고로 하여 범위를 좁혀가며 숫자를 맞추는 게임 만약 컴퓨터가 만든 난수k가 35이고 사용자가 입력한 숫자 m이 70이라 할 때 "입력한 숫자보다 매우낮음"으로 출력 만약 사용자가 0을 입력하면 정답을 출력하고 종료.

  24. 컴퓨터가 생성한 정수 난수 맞추기

  25. 실행결과

  26. 컴퓨터와 하는 가위바위보 게임 가위는 1, 바위는 2 그리고 보는 3이라는 숫자로 구분한다고 가정 먼저 컴퓨터가 난수 함수인 rand를 이용하여 1, 2, 3 중의 하나의 숫자를 생성하고 이어서 이용자가 1, 2, 3 중에서 하나의 숫자를 입력하면 각자가 선택한 것을 출력하고 이어서 게임의 판정 결과를 표시하되 다음 결과 중에서 하나를 출력. 이용자가 0을 입력하면 게임을 종료하고 그렇지 않은 경우에는 계속 반복

  27. 컴퓨터와 하는 가위바위보 게임 컴퓨터는 1, 2, 3 중의 하나를 난수로 결정해야 하고 매 실행마다 달라져야 하므로 이 값을 변수 com에 저장

  28. 실행결과

  29. 구구단 문제풀기 난수는 컴퓨터를 이용한 학습 프로그램을 개발하는데 있어서 다양하게 응용할 수 있다. 예를 들어 사칙연산 문제풀기나 구구단 학습 프로그램을 개발하는데 있어서 매 실행마다 서로 다른 문제가 출제되도록 만드는데 이용할 수 있으며, 그 외의 수학문제나 단어 학습 프로그램에도 응용할 수 있다. 이 절에서는 구구단 학습 프로그램을 개발하기에 앞서 문제풀기와 채점에 대해서 설명.

  30. 구구단 문제풀기 매 실행마다 10개의 다른 구구단 문제를 생성 난수를 이용하여 1~9 사이의 숫자를 생성하고, 출제된 문제를 기억하기 위해 배열을 이용. 구구단 각 문제마다 두 개의 난수를 만들어야 하고, 첫 번째 난수는 배열 dan에, 두 번째 난수는 배열 num에 저장한다고 가정. 사용자가 입력한 답은 배열 dap에 저장. 실행결과

  31. 구구단 문제풀기 문제풀기 방식은 두 가지 방식을 이용할 수 있다. 첫 번째 방법은 하나의 문제를 출력하고 이어서 사용자로부터 문제의 답을 입력 받으면 다시 다음 문제를 출제하는 것을 반복 두 번째 방법은 앞에서와 같이 먼저 10개의 문제를 모두 화면에 출력한 다음 각 문제의 답을 입력 받는 방법 첫 번째 방법은 문제를 출제하는 반복문 안에 입력함수인 scanf를 넣어 비교적 쉽게 프로그램을 작성할 수 있지만 두 번째 방법은 10개의 문제를 출력하고 나서 사용자의 답을 입력 받아야 하기에 커서의 위치를 조절해주어야 한다. 커서의 위치를 조절하기 위해 사용자 정의 함수 gotoxy를 사용하며 두 번째 방법을 이용하여 프로그램을 작성

  32. 구구단 문제풀기 10개의 문제를 모두 화면에 출력한 다음 각 문제의 답을 입력 받는 방법 10개의 문제가 다음과 같이 출력되었다고 가정한다면 첫 번째 문제의 답을 입력하는 위치는 ①이 된다. 이곳에서 사용자가 첫 번째 문제의 답을 입력하고 Enter 키를 누르면 커서는 ②위치로 이동해야 한다.

  33. 실행결과

  34. 구구단 문제풀기(채점과정의 추가) 채점 방법도 두 가지 방법을 생각할 수 있다. 첫 번째 방법은 답을 입력하면 바로 그 문제의 채점결과를 출력하는 방법이고, 두 번째 방법은 10개의 답을 모두 입력하고 나서 채점 결과를 출력하는 방법 첫 번째 방법은 반복문에조건문을 사용하여 비교적 쉽게 프로그램을 작성할 수 있지만 두 번째 방법은 [응용 19-9]와 같이 커서의 위치를 이동시켜 출력해야 하고 여기에서는 두 번째 방법을 사용한다. 사용자가 입력한 답이 맞았으면 입력한 답 바로 오른쪽에 'O', 틀렸으면 'X'표시를 하고 이어서 틀렸을 경우에만 정답을 출력한다. 출제된 문제는 배열 dan과 num에 저장되어 있으며, 사용자가 입력한 답은 배열 dap에 저장되어 있다.

  35. 구구단 문제풀기(채점과정의 추가) 10개의 답을 모두 입력하고 나서 채점 결과를 출력하는 방법 사용자가 입력한 답이 맞았으면 입력한 답 바로 오른쪽에 'O', 틀렸으면 'X'표시를 하고 이어서 틀렸을 경우에만 정답을 출력한다. 출제된 문제는 배열 dan과 num에 저장되어 있으며, 사용자가 입력한 답은 배열 dap에 저장되어 있다.

  36. [응용 19-11] line 1~line 14는 [응용 19-10]과 동일 실행결과

  37. 시간과 날짜 예를 들어 문제풀이 프로그램에 대해 주어진 시간 안에 문제풀이를 해결 했는가? 또는 그 문제를 해결하는데 걸린 시간은 얼마인가? 또한 특정일로부터 1000일 후가 언제인가? 두 개의 특정일 사이의 날짜 수는 며칠인가? 2020년도 추석은 무슨 요일인가? 등을 계산하기 위해서는 시간과 날짜와 관련된 함수들을 적절하게 이용해야 한다. 시간과 날짜와 관련된 라이브러리 함수들은 다음과 같다. 다음의 함수들은 헤더파일 <time.h>를 필요로 한다. 날짜와 시간관련 라이브러리 함수들

  38. 현재의 날짜와 시간을 출력 □ 시간과 날짜를 하나로 묶어서 문자열로 처리하는 방법 시간과 날짜를 처리하는데 있어서 기본적으로 함수 time과 localtime을 사용하며 계산된 시간을 문자열로 출력하기 위해 함수 asctime를 사용. 함수 time은 1970년 1월 1일 자정 이후 현재까지 경과된 시간을 초(second)로 반환해 주는 함수이며 함수 localtime은 시간 값을 시․분․초로 반환한다. 실행결과

  39. 현재의 날짜와 시간을 출력 □ 날짜와 시간을 단위 요소별로 구분하여 출력하는 방법 함수 localtime은 tm이라는 하는 구조체 포인터를 이용하고, 구조체 멤버를 이용하면 날짜에 대해서는 년・월・일로 그리고 시간에 대해서는 시・분・초 단위로 구분할 수 있으므로 프로그래머가 원하는 형식대로 분리하여 사용할 수 있다. 프로그램 표시

  40. 시간 차이의 계산 어떤 문제가 주어지고 사용자가 답을 하기까지 몇 초가 경과되었는지를 확인하거나, 주어진 문제 해결에 있어서 어떤 알고리즘의 연산이 더 빠른가를 비교할 때 시간 차이를 계산한다. 시간 차이를 계산하는 방법은 프로그램에서 어떤 동작을 시작하기 직전에 현재의 시간을 저장(A)하고, 동작이 완료된 직후에 현재 시간을 저장(B)하여 다음과 같이 계산. 시작 시간과 종료 시간을 확인하는데 있어서 함수 time과 clock을 사용

  41. 시간 차이의 계산(함수 time과 clock) 함수 time은 초단위까지만계산한다.

  42. 시간을 지연시키는 함수 대부분의 프로그램들은 문제 해결의 실행 속도를 높이기 위해 다양한 알고리즘을 사용하지만 경우에 따라서는 제한된 시간을 주어 의도적으로 프로그램의 실행을 잠시 멈추게 하는 경우도 있다. 시간을 지연시키는 함수로 Sleep(S는 대문자)가 있는데 함수의 인자로는 1/1000초 단위의 정수가 사용된다. 따라서 5초간 지연시키고자 한다면 Sleep(5000) 과 같이 사용할 수 있다. 함수 Sleep은 헤더 파일 <windows.h>을 필요로 한다.

  43. 시간을 지연시키는 함수 함수 Sleep(3500)를 사용하여 3.5초간 프로그램의 실행을 지연시킨다. 프로그램을 실행하면 "start!"를 출력하고 3.5초가 경과된 후에 "end"를 출력하며, 마지막에 경과된 시간은 "time : 3.500000"으로 출력 실행결과

  44. 시간을 지연시키는 함수 시간을 처리하는 함수와는 다른 개념의 함수이지만 유용하게 사용할 수 있는 kbhit라는 함수가 있다. 이 함수의 원형은 다음과 같이 함수의 인자가 없으며, 키보드 상의 어떤 키를 누르면 0이 아닌 값을, 누르지 않은 상태라면 0값을 반환하는 함수이다. 함수 kbhit는 헤더 파일 <conio.h>를 필요로 한다. 프로그램의 실행 중에 아무 키나 누르기 전까지만 프로그램을 계속 실행 시키고자 한다면 순환문while과 함께 다음과 같이 사용할 수 있다. 연산자 !은 논리적 부정(not)을 나타내는 연산자로써 키를 누르지 않는다면 !kbhit의 값은 0이 아닌 값을 반환하므로 순환이 계속되지만, 키를 건드리게 되면 !kbhit의 값은 0이 되어 순환을 벗어난다.

  45. 시간을 지연시키는 함수 연산자 !은 논리적 부정(not)을 나타내는 연산자로써 키를 누르지 않는다면 !kbhit의 값은 0이 아닌 값을 반환하므로 순환이 계속되지만, 키를 건드리게 되면 !kbhit의 값은 0이 되어 순환을 벗어난다. 실행결과

  46. 날짜수의 응용 프로그램 ① : 2003년 4월 15일부터 2008년 5월 6일까지의 날짜 수를 계산 프로그램 ② : 2020년 5월 5일의 요일계산 프로그램 ③ : 2006년 1월 1일부터 1000일 후의 날짜를 계산 C 언어에는 시간과 관련된 라이브러리 함수들은 있으나 날짜 자체와 관련된 함수들은 없으므로 새로 작성해야 한다. 프로그램 ①과 ②의 예는 날짜수를 계산해야 하므로 기준이 되는 날짜를 사용한다. 날짜수를 계산하는 방법은 여러 방법이 있을 수 있지만 쉽게 계산하는 방법은 다음과 같다.

  47. 특정일 a와 b사이의 날짜수 계산 기준일(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

  48. 특정일 a와 b사이의 날짜수 계산 특정일 a가 2007년 3월 20일 [단계 1] 1년 1월 1일부터 바로 전 년도 마지막일 즉, 2006년 12월 31일까지의 날짜 수 [단계 2] 2007년 1월 1일부터 해당 월의 전달(2월 말일)까지의 날짜 수

  49. 특정일 a와 b사이의 날짜수 계산 특정일 a가 2007년 3월 20일 [단계 1] 1년 1월 1일부터 바로 전 년도 마지막일 즉, 2006년 12월 31일까지의 날짜 수 [단계 2] 2007년 1월 1일부터 해당 월의 전달(2월 말일)까지의 날짜 수

  50. 실행결과

More Related