Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
::6. CFL 프로그래밍
2 MJU CE C Language Programming
학습 목표
알고리즘과 플로우 차트의 이해 실제 실행가능한 플로우차트의 작성법 플로우차트에 의한 알고리즘 작성 연습
C언어 작동 원리의 사전 학습
3 MJU CE C Language Programming
알고리즘(Algorithm)?
어원: "Muhamad Ibn Musa Al Kowarizmi" 처리 해야 할 일을 적절한 크기의 요소로 단계별로 서
술 an effective method for solving a problem using
a finite sequence of instructions.알고리즘은 유한한 명령어의 배열을 이용하여 문제를해결하는 방법이다.
4 MJU CE C Language Programming
알고리즘을 기술할 언어
프로그래밍 언어보다 추상적이어야 한다. 사람이 이해하기 쉬운 언어
Flow chart, Pseudo code, 자연 언어
5 MJU CE C Language Programming
알고리즘의 기술: flowchart
6 MJU CE C Language Programming
Flow-Chart Symbols
실행
순서연결
시작/끝데이터입,출력
조건부갈라짐
7 MJU CE C Language Programming
방에 불이 안 들어올 때...
코드 끼운다
시작
스위치 켠다
전구를 교체
yes
yes
yes
수리공 부른다
코드가 빠졌나
스위치 꺼졌나
전구 고장
8 MJU CE C Language Programming
밥먹기: 반복
숟가락놓는다
시작
한숟가락먹는다
yes배가 부른가
9 MJU CE C Language Programming
Program 설계
Data 구조 + Algorithm 설계 = program
10 MJU CE C Language Programming
암산?
건우야, 1부터 5까지더하면 얼마지?
15
그럼 413부터 435까지더하면?
헐!
11 MJU CE C Language Programming
메모지의 활용
계산만할줄안다면메모지를활용하면된다.
12 MJU CE C Language Programming
체계적으로 ... 1: 데이터 구조
green : 지금까지의 합을 기록
yellow: 이번에 더할 수를 기록
blue: 더해야 하는 마지막 수
13 MJU CE C Language Programming
체계적으로 ... 2: 데이터 초기값
0
435
413
green : 지금까지의 합을 기록
yellow: 이번에 더할 수를 기록
blue: 더해야 하는 마지막 수
14 MJU CE C Language Programming
쪽지 이름을 잘 지어야…
green, yellow, blue 보다는
0
435
413
sum
numToAdd
lastNumber
합
이번에더할수
마지막더할수
15 MJU CE C Language Programming
체계적으로 ... 3: 알고리즘
다음을 끝날 때까지 반복한다. 1: ( ) 이 ( ) 보다 ( )면 계속한다. 2: ( ) 과 ( ) 을 더해서 ( ) 에다 적는다. 3: ( ) 을 1 증가시킨다. 0
435
413
sum
numToAdd
lastNumber
16 MJU CE C Language Programming
대략의 흐름
준비작업
반복계산
종료
17 MJU CE C Language Programming
413 ~ 435 합 구하기
sum = 0
numToAdd = 413
last= 435
sum = sum + numToAdd
numToAdd 를 1 증가
numToAdd <= last
종료
::CFL: 실행되는 플로우차트
4
19 MJU CE C Language Programming
CFL: C-like Flowchart Language
목적: 실행이 가능한 플로우차트를 작성하여 프로그래밍 언어에 무관하게 (language-neutral) 프로그래밍의 개념을 익히고 실행 시 일어나는 일을 눈으로 확인하여쉽게 이해한다.
특징:C언어의 문법과 1:1 대응 되도록 설계되어 추후 C언어를 배우기 쉽도록 설계되었다.
20 MJU CE C Language Programming
CFL 의 특징
Simple Aligned with C language Structured programming
21 MJU CE C Language Programming
CFL 첫 화면
•실행을위해서는Java Runtime (JRE) 필요:• java.oracle.com에서 download
22 MJU CE C Language Programming
CFL 실습 준비
cfl_3.06.exe 를 다운로드. (현재 최신 버전) 더블 클릭 실행되지 않으면 (초기 화면이 뜨지 않으면) Java RTE 설치 (다음 슬라이드)
설치 된 후 다시 시도
23 MJU CE C Language Programming
Java Runtime 확인
설치 되어있는지 확인:
없으면 JRE를 설치
24 MJU CE C Language Programming
JRE설치: Oracle site
25 MJU CE C Language Programming
26 MJU CE C Language Programming
:: 실습은 추후에1. CFL 개요
4,5
28 MJU CE C Language Programming
목표
CFL 전체를 훑어보자. 상세한 부분은 몰라도 넘어가자.
29 MJU CE C Language Programming
CFL 편집 및 실행 환경
플로우차트를그리는영역
30 MJU CE C Language Programming
CFL의 기능
메모리, 연산, 비교, 반복, 배열, 함수 문자 입-출력, 숫자 입-출력 단순한 그래픽 소리파일 재상 LED 이벤트 처리 단계별, 일괄적 실행 가능
31 MJU CE C Language Programming
CFL 프로그램은...
전체적인 흐름:노드(node)와 그 연결(arc)로 이루어 진다.
노드 안에서는:각종 명령어를 사용한다.
명령어:수식, 변수, 입출력 등
node
arc
32 MJU CE C Language Programming
A. Node를 만들어보자.
Context menu: 바탕에 마우스 우측 버튼
33 MJU CE C Language Programming
B. 노드를 연결해보자.
마우스 우측 버튼을 한 노드에서 누르고, 끌어서 다른 노드에서 놓는다.
34 MJU CE C Language Programming
C. 노드에 글자를 넣어보자
한번클릭 다시클릭 내용타이핑
타이핑후에 Esc 키나 Enter키를누른다.
35 MJU CE C Language Programming
Node 가 하는 일은…
메모리 상태를 바꾸는 일 외부로 데이터를 보여주는 일 외부에서 데이터를 가지고 들어오는 일
36 MJU CE C Language Programming
37 MJU CE C Language Programming
CFL 요소
Node 의 종류:시작 노드(main), 처리 노드(process), 비교 노드(decision
혹은 'if') 입출력 노드(I/O), 코멘트(comment), 함수(Function)
메모리(변수)임시 변수 Acc(정수), fR(실수)정수 변수들(float로 재 정의 가능)배열 변수 r , s
입력과 출력(키보드+모니터) 노드 간의 연결
38 MJU CE C Language Programming
CFL의 실행
"main" node에서 시작, return 노드에서 종료 연결된 노드가 없으면 실행 종료 화살표 연결을 따라서 하나씩 수행 : step 변화된 값은 붉은 배경으로 표시 처음부터 다시 시작하려면: reset을 먼저 클릭 일괄 수행: run 일괄 수행중 멈춤: stop
39 MJU CE C Language Programming
연습 문제
배포된 test.cfl 프로그램을 다운로드 받은 다음,[file]-[open]으로 열어서 한 단계씩 실행을 해보자.
제출: 마지막 단계에서의 스크린 샷을 저장하여 제출
40 MJU CE C Language Programming
변수
기억장치 정수형(int -- integer): a,b,c,d, i,j,k,… 변수 이름 실수형(float – floating point): 추후 필요에 따라 지정
임시 변수 acc (정수형) Accumulator 정수 계산 결과 저장
임시변수 fR(실수형) Floating-point Register 계산 결과 임시 저장
이름과 타입을 새로 정의할 수 있다. 처음에는 값이 제멋대로 들어있음
("garbage value" 혹은 "쓰레기 값")
41 MJU CE C Language Programming
메모리는 원래 눈에 보이는 것이 아니지만
학습자의이해를돕기위해눈에보이게한것.
42 MJU CE C Language Programming
임시 변수 ACC(Accumulator)
모든 계산의 결과는 항상 ACC 또는 fR에 임시로 저장된다.
정수 연산의 결과는 ACC 실수 연산의 결과는 fR (floating-point register)
43 MJU CE C Language Programming
정수를 저장해보자
Process Node를 만든다음 a=1 을 넣어보자. 또다른 노드에 b=2를 넣는다. 그림과 같이 연결 한다.
일괄 및 단계별 실행
44
• 초기화1: 처음상태로, 입력데이터지운다• 초기화 2: 처음상태로, 입력데이터복구• Step in: 한단계실행(함수호출시함수안으로)• Next(Step over): 한단계(함수호출시함수일괄실행)• Run/Resume: 연속실행• Pause: 일시멈춤• Break Point: 중단점설정
초기화1 초기화2 step-in next run pause breakpoint
* 단계별실행및중단점은오류잡기(debugging)에사용
Pop-up menu 의 사용(우측 마우스 단추)
45
빈캔버스에클릭한경우
선택한노드위에서클릭한경우
여러 노드 선택후 메뉴
46
복사
삭제
맞춤
나가는 연결삭제
새 모듈(페이지) 만들기
47
48 MJU CE C Language Programming
Tool Tip
툴바가 궁금하면 마우스를 올려놓는다.
48
49 MJU CE C Language Programming
시작 노드
실행의 시작점 "main"으로 표시 삭제할 수 없음 하나만 존재 화살표 선으로 연결해야
다음 노드 실행
50 MJU CE C Language Programming
끝 노드
return 혹은 return <값> *상세한 차이는 함수에서 설명
51 MJU CE C Language Programming
Lesson 1: Assign노드 만들고 연결하기
목표: 그림과 같은 차트 만들고 실행하고 결과 관찰하기
52 MJU CE C Language Programming
1. 노드 만들기
원하는 위치에 우측 마우스 메뉴가 뜬다. Process node 선택 노드가 생기고 입력 준비가 된
다. 내용물을 입력한다. (키보드) Enter키를 친다. 다음 노드가 생긴다. 내용을 입력한다. Esc 키를 친다. 입력 종료
53 MJU CE C Language Programming
실습 lab06_01
main 노드와 end노드를 연결해보자. 두 노드의 위치를 이리 저리 옮겨보자. 연결을 다시 삭제해보자
:: text: 6장처리 노드
6p.12~18
55 MJU CE C Language Programming
처리 노드(Process Node)
변수값 설정(assignment, 사칙 연산 등) 정수 연산, 실수 연산이 있음 정수 연산 결과는 acc 변수에 임시 저장 실수 연산 결과는 fR 변수에 임시 저장 필요시 일반 변수에 복사 보관
56 MJU CE C Language Programming
처리 노드 1: 배정(assignment) 연산
k = 3 // k 3, 즉 변수k에 3을 복사"k에 3을 배정한다, k에 3을 assign한다" 등으로 표현
i = k // 변수 i에 k의 값을 복사해 넣는다. 배정 연산은 등식이 아니다. 등호 왼쪽의 변수에 오른쪽 수식 값을 넣어준다.
즉 방향이 i k 방향이며 i k 가 아니다. 3 = n ( ERROR )
편집 순서
58 MJU CE C Language Programming
노드의 이동
한 개: 그냥 끌기 여러 개: 범위 선택 후 끌기 범위 선택 방법: 사각형 범위지정 혹은 control-click
여러 번
59 MJU CE C Language Programming
Demo: simple assignment
노드의 종류 선택 위치에 클릭 생겨난 노드를 클릭 텍스트 입력난이 뜬다 내용을 입력 후 Enter Shift-drag(혹은 우측버튼 누르고 drag)으로 연결(나
중에 연결해도 된다)혹은 이전 노드 바로 아래에 이동 자동 연결
60 MJU CE C Language Programming
lab06_03
i 변수에 1값을, j변수에 2를, k변수에 3을 각각 순서대로 assign하는 CFL을 작성하고 step을 이용하여 실행하여 보라. 변수에 값이 저장되는 것을 확인하고 제출한다.
61 MJU CE C Language Programming
처리 노드 2: 정수의 연산
i + j 덧셈 결과를 acc에 i * 3 k / 2 결과는 정수(몫), acc에 저장 n % 3 나머지를 acc에 저장
대개의 경우 assignment 와의 결합 a = k / 2 나눗셈의 몫을 a에 저장 n = n + i 결과를 다시 n에 저장
i + j
62 MJU CE C Language Programming
처리 노드 3: mixed
a = b + c // Assignment(=) 연산이 나중. a = a + 1 i = n * 2 + 3 // 순서: *, +, =
63 MJU CE C Language Programming
처리 노드 4: 그 외의 연산
i 값이 1 증가 됨(++되고+ + 안됨)
j 값이 1 감소 됨
k값이 3 증가( k = k + 3 )
n값이 2배가 된다.(n=n*2)
n 값이 반이 된다.
i ++
j --
k += 3
n *= 2
n /= 2
++ i
-- j
64 MJU CE C Language Programming
그 외의 연산 2
j+k를 i에 저장
연산 결과를 acc에 임시저장
주의: 전치(prefix) 연산 ++n 과 후치(postfix) 연산 n++ 는 assignment와 사용시 결과가 다르다.( -- 도 마찬가지)
i = j + k
i + 2 * j
i = n++ i = ++n
65 MJU CE C Language Programming
우선 순위
곱셈, 나눗셈, 나머지 덧셈, 뺄셈 Assignment ( = += *= 등) 괄호의 사용
예:a = (( n + 1 )/2 )*(k * 2 + 1)
66 MJU CE C Language Programming
연습 문제: ex651
CFL에서 i+1 이라는 노드와 i++ 라는 노드 두 개를실행하여보고
두 연산의 차이를 정확히 서술하라.
67 MJU CE C Language Programming
Instructor Page
651 문제. 종료후 데모와 함께 설명.
68 MJU CE C Language Programming
Demo
4칙 연산: 결과가 임시 변수에 저장 assignment 연산: 지정된 변수에 저장
69 MJU CE C Language Programming
실습 lab06_04
다음과 같은 단계로 실행하는 CFL을 작성: Assignment를 이용하여 i에 1을 집어 넣고 j에 9를 집어 넣는다. i + j 를 실행한다. 결과(ACC)를 다시 k에 넣는다. 한 단계씩 실행해서 값이 어떻게 변하는지 관찰한다.
70 MJU CE C Language Programming
숙제 ex652: 숫자 마술
1부터 9사이의 어떤 수를 n 에 기억시킨다. 이 수에 4를 더한다. 이 결과에 2를 곱한다. 이 결과에 6을 뺀다. 이 결과를 2로 나눈다. 이 결과에서 n(최초의 수)를 뺀다. 최종 결과를 확인하라. 아마도 1이 되었을 것이다.
71 MJU CE C Language Programming
Comment (Note) Node
실행에 영향 없음. 참고용.
72 MJU CE C Language Programming
변수 타입 및 이름의 변경
값 대신 타입 + 변수명 + Enter키
Before After
73 MJU CE C Language Programming
실습 lab06_05
섭씨 24도이면 화씨로 몇 도일까? CFL을 이용하여 계산하여 보자. 24만 다른 수로 바꾸면 나중에 다른 온도도 계산이 가능하게 될 것이다.
공식: F = C * 9/5 + 32 를 변형, 활용하자 두 개의 변수를 각각 far 와 cent로 개명한다. 섭씨 값을 나타내
는 수는 cent에 저장하고 화씨 온도를 나타내는 최종 값은 far에 저장한
다. 여러 가지 데이터를 가지고 테스트하여 어떤 오차가 있는지 살
펴본다.
74 MJU CE C Language Programming
float 변수의 지정
75 MJU CE C Language Programming
실수 연산(float)
3.14/2 둘 중 하나라도 실수형이면 실수 연산임
a/b 정수 연산임.
a/b 실수 연산임.
76 MJU CE C Language Programming
실습 615
섭씨온도를 입력하면 화씨 온도를 출력하는 CFL 프로그램을 작성하라.
정수형을 사용하면 오차가 있으므로 float 를 이용하여오차를 최대한 줄이도록 하라.
공식: F = C * 9/5 + 32 를 변형, 활용하자 두 개의 변수를 각각 far 와 cent로 개명한다. 섭씨 값
을 나타내는 수는 cent에 저장하고 화씨 온도를 나타내는 최종 값은 far
에 저장한다.
77 MJU CE C Language Programming
정수 연산의 활용
정수는 정밀한 계산에는 부적합 대신 정수로서의 중요한 특성이 있음나눗셈, 나머지 연산
78 MJU CE C Language Programming
ex653: 정수 연산의 활용
정수 나눗셈, 정수 나머지 연산 원숭이 수를 a 에 assign하고 바나나 수를 b에 assign
한다. 원숭이 한마리당 나눠줄 바나나의 수를 c에,
남는 바나나의 수를 d에 저장하게 계산한다. * Comment 노드를 활용하여 어떤 변수가 어떤 용도
로 쓰였는지 반드시 표기하도록 한다.
:: Built-in functions미리 만들어진 함수
80 MJU CE C Language Programming
수학용 함수
sin, cos, tan, exp, log, log10, pow, sqrt sin, cos, tan – sine, cosine, tangent exp x : ex
log x : pow x y : sqrt x : argument는 변수 혹은 상수만 가능. 다른 수식 불가.
x
yxxlog
81 MJU CE C Language Programming
함수 사용: 변수 혹은 상수만.
사용 예:y = sin xz = cos 0.53y = pow 0.5 3 0.53
z = sqrt 1.44 안되는 예:
y = sin x+1.1z = tan (x * 3.14) 어떻게 하면 될까?
82 MJU CE C Language Programming
연습 문제
4x2 + 3x + 1 = 0 의 두 해를 구하라.
Hint1: 근의 공식을 이용한다. Hint2: 변수를 float로 선언해야 한다.
:: text: 7장CFL 입력과 출력
7
84 MJU CE C Language Programming
User Interaction
85 MJU CE C Language Programming
출력(output)
컴퓨터 외부시각적인 출력,청각적인 출력 등
가장 흔한 방법은text 출력
86 MJU CE C Language Programming
입력(input)
외부 컴퓨터* '외부'는 대개 사람.
87 MJU CE C Language Programming
바보같은 로봇
3x4=12
곱셈해봐.
곱셈해봐.
3x4=12
88 MJU CE C Language Programming
입력이 있다면
뭘곱할까요?
곱셈해봐.
3 4
3x4=12
8 9
8 x 9 = 72
89 MJU CE C Language Programming
용어
읽는다 = 읽어 들인다 = 입력한다 (input)
출력한다 = output
90 MJU CE C Language Programming
프로그램을 수정 없이 여러 번 써먹으려면?
프로그램 자체를 수정하지 않고 외부에서 실행시에 데이터를 가져온다: “입력”
정수의 입력: scanf
* Process node에 scanf써넣으면I/O node로변함.
정수 입력 하기
변수명앞에 &를붙인다.
return 키 치는 순간버퍼로 들어간다
93 MJU CE C Language Programming
내부적인 일
키보드에서 buffer에 입력된 1, 2, 3 세개의 문자는 각기 49, 50, 51 이라는 정수로 저장되어있다.
컴퓨터:흠, 49가 들어왔으니 '1'이라고 써있는 키를 눌렀구만. 일단
이걸 정수 1로 바꿔야하니 48을 빼서 저장하면 되지.이번엔 50이 들어온 걸 보니 사용자가 '2'키를 눌렀구만. 그
럼 아까 1은 10으로 바꾸고 2를 더해서 12를 저장하자.이번엔 51이 들어온 걸 보니 사용자가 '3'키를 눌렀구만. 그
럼 아까 12는 10을 곱해서 120으로 바꾸고 3를 더해서 123을 저장하자.
이번엔 32가 들어온 걸 보니 space bar를 눌렀군. 그럼 정수는 아까 끝난거니까 123을 전달해주면 되겠군.
93
94 MJU CE C Language Programming
사용자가 입력을 안하면...
scanf 에서 진행되지 못한다. "blocking" 되었다고 표현함.
94
문자열 및 정수의 출력: printf
95
96 MJU CE C Language Programming
여러 항목
빈 칸으로 구분
출력에서 줄을 바꾸고 싶으면…
97
영문자판에서는 \ 키,한글 자판에서는 ₩키.
98 MJU CE C Language Programming
lab06_07 (614번)
두 개의 정수를 입력하여 곱을 출력하는 CFL 프로그램을 작성한다.
코멘트에 어느 변수와 어느 변수를 곱해서 어디에 저장할 것인지 적어두고 시작한다.
99 MJU CE C Language Programming
연습 ex654
정수로 분(minutes)을 입력하면 몇 시간 몇 분인지 출력하게 하라.
변수 이름을 적절한 이름으로 개명하고 코멘트를 달아준다.
사용자가 편리하도록 무엇을 입력할지를 출력으로 알려주고 결과도 친절하게 표시하라. (입력 안내 예: "시간을 분 단위로 입력:" 출력 예: "110분은 1시간 50분입니다.")
Hint: 정수 나눗셈과 정수 나머지를 활용
100 MJU CE C Language Programming
연습 655
시간과 분을 정수로 입력하면 이것을 총 분 수로 표시하라.
출력 형식: “130분은 2시간 10분입니다.”
::문자의 표현
7
102 MJU CE C Language Programming
숫자 계산 보다는 텍스트가 많다!!!
글자들은 어떻게 나타낼까?
103 MJU CE C Language Programming
문자의 저장
컴퓨터의 키보드가 망가졌다. 메모를 해야 하는데 숫자 키보드밖에는 작동하지 않는다. 그래서 다음과 같이 암호화를 하기로 한다.문자 a b c d e f g h i j코드 97 98 99 100 101 102 103 104 105 106문자 k l m n o p q r s t코드 107 108 109 110 111 112 113 114 115 116문자 u v w x y z코드 117 118 119 120 121 122
104 MJU CE C Language Programming
아래의 숫자들은 무슨 단어들일까?
104 10597 112 112 108 101115 117 110 110 121
a b c d e f g h i j97 98 99 100 101 102 103 104 105 106k l m n o p q r s t107 108 109 110 111 112 113 114 115 116u v w x y z117 118 119 120 121 122
105 MJU CE C Language Programming
CFL에서 문자를 저장해보자
a = 'a' b = 'z' c = 'A' d = 'B' e = '1';
"문자 a 의코드값"이라는뜻.a = 97 과같음.
106 MJU CE C Language Programming
문자를 출력하는 함수 putchar
putchar 정수 예: putchar 98 putchar 문자상수 예: putchar 'k' putchar 변수 명 예: putchar c putchar 수식 X
107 MJU CE C Language Programming
정수로 문자 나타내기
m = 97 을 실행한 이후에 putchar m 을 실행하여보라. n = 98 을 실행한 이후에 putchar n 을 실행하여보라.
이번에는 같은 m 과 n을 printf로 출력해보라. m = 'a' 라고 실행한 후에 putchar를 해보라. 또 m= 'b' 라고 실행한 후에 putchar n 을 해보라.
108 MJU CE C Language Programming
정수 값과 문자 값은 구분이 될까?
i = 97 putchar를 하면 'a'가 출력 printf를 쓰면 97이 출력.
==> 이것만 가지고 의도를 알 수는 없다.
109 MJU CE C Language Programming
ASCII 표준 코드표
110 MJU CE C Language Programming
apple 입력, 저장하는 방법 1
a p p l e
97 112 112 108 101
111 MJU CE C Language Programming
apple 입력, 저장하는 방법 2
a p p l e
97 112 112 108 101a p p l e
112 MJU CE C Language Programming
apple 출력 하는 방법 1
97 112 112 108 101
113 MJU CE C Language Programming
apple 출력 하는 방법 2
apple
97 112 112 108 101
::문자 별 입력과 출력
115 MJU CE C Language Programming
관점의 차이
표준입력에서 입력한 글자들은 여러 가지 다른 관점에서 볼 수 있다.
예: 123 정수 백이십삼세 개의 글자 '1', '2', '3'
116 MJU CE C Language Programming
CFL 문자 입력
get a character from "standard input device" (표준입력 장치에서 입력된 문자의 코드 값을(정수) 임시메모리에 저장한다.
getcharcharacter = 문자
117 MJU CE C Language Programming
CFL 문자 출력
put the given character to the "standard output device"
putchar aa의내용(정수)을 char로변환하여표준출력장치로보낸다. 표준출력장치가콘솔이면문자형태로출력함.표준출력장치가파일이면한바이트를저장
118 MJU CE C Language Programming
CFL 비교(demo)
scanf &a
scanf &a 실행전 scanf &a 실행후
119 MJU CE C Language Programming
getchar 의 경우
getchar실행전 getchar실행후
120 MJU CE C Language Programming
저장까지 한번에
같다
121 MJU CE C Language Programming
putchar and printf
122 MJU CE C Language Programming
연습 ex672
키보드 버퍼에서 3개의 문자를 읽어서 각각 문자로도출력하고 정수 값으로도 출력해주는 프로그램을 작성하라.
123 MJU CE C Language Programming
연습 673 나중에
키보드 버퍼에서 읽어 들일 문자가 있는 동안에는 모두 하나씩읽어들인다.
문자 읽기에 성공하면 그 문자가 영어 소문자인지 아닌지를 판별하여 소문자의 개수를 세고 입력이 끝나면 소문자의 총 개수를 출력한다.
*주의: 데이터가 더 이상 없으면 어떤 변화가 생기는지를 관찰해서 멈출 조건을 결정한다.
** x 가 5 이상 10 이하인지를 판별하려면5 <= x <= 10 이렇게 쓰면 틀린다.5<= x && x <=10 이라고 써야 한다.
"그리고"의뜻.
124 MJU CE C Language Programming
문자로 입력된 숫자 값 저장하기
키보드에서 숫자 문자 하나를 읽어서 변수 c에 그에 해당하는 정수 값을 변수 n에 저장하라. (코드 값이 아니다. 예를 들어 '1' 이 입력된 경우 코드 값은 49 이지만우리가 원하는 값은 1이 저장되는 것이다.
비교를 10번 하는 것은 바보 같은 짓이다. 범위만 체크한 후 간단한 뺄셈이면 된다.
125 MJU CE C Language Programming
ex674: 두 자리 정수
두 번의 getchar를 이용하여 두 자리 정수의 두 자리를 각각 입력하여 그 정수 값을
n에 저장하라. 예를 들어 2345 가 키보드 버퍼에 있었다면 2와 3만
을 읽어서 정수 23으로 하나의 변수에 저장하는 것이다. 간단한 산수로 가능하다.
126 MJU CE C Language Programming
675: 세자리 정수
키보드 버퍼에 세자리 정수를 입력하였다. 이때 scanf를 쓰면 간단히 정수 값을 알 수 있지만
getchar로 세 글자를 읽어들여 정수를 만들어 낼 수있다. 예를 들어 123이 입력된다면 문자 '1', 문자'2', 문자 '3' 으로 읽는 것이다. 정수로 따지면 49, 50, 51이 들어온다.
첫째 문자에 해당하는 정수값을 알아내어 k에 저장, 둘째를 l에, 세째를 m에 저장한 다음 k*100 + l*10 + m 을 계산하면 정수 값을 알 수 있다.
이것을 printf로 출력하라.
127 MJU CE C Language Programming
ex676: 소문자를 대문자로
입력된 모든 문자를 대문자로 변환하여 출력하는 프로그램을 작성하라. 소문자가 아닌 경우는 그대로 출력하면 된다. 예를 들어
입력: Hello World. 라면 출력은 HELLO WORLD. 가 된다.
::조건부 분기 구조
8
129 MJU CE C Language Programming
조건에 따라 갈 길을 다르게
IF: 만들기
if 노드생성
내용입력(“if”는입력않음)
입력후
각 경우 실행 내용을 입력
131
132 MJU CE C Language Programming
비교 노드에서는: 비교 연산
n > 0 n < k + 1 i <= 0 i (주의: i =< 0 안됨) m >= k m k (주의: m => k 안됨) m == 5 (주의: m=5 안됨). n != 0 n ≠ 5 의 뜻.
133 MJU CE C Language Programming
주의 사항
같은가 물어볼 때는 = 가 아니라 == 이다.
134 MJU CE C Language Programming
연습 문제 632
두개의 정수를 입력 받아서 먼저 입력된 정수를 두번째입력된 정수로 나눈 몫을 출력하게 하라.
단, 두번째 수가 0이면 나눌 수가 없으므로 계산 대신적절한 오류 메시지(예: "나눌 수 없습니다.")를 출력하고 종료하면 된다.
135 MJU CE C Language Programming
연습 633
두개의 정수를 입력 받으면 둘 중에 큰 수를 출력하는프로그램을 작성하라.
136 MJU CE C Language Programming
여러 개의 조건
i > 0 && i < 100 0보다 크고 100보다 작으면 True (조건 만족)둘 중 하나라도 아니면 false
주의: 0 < i < 100 이렇게는 안된다! i < 0 || i >= 100 0 미만이거나 혹은 100 이상이면 True둘 다 아니면 false
137 MJU CE C Language Programming
연습 문제 634
원금과 이율 (percentage)을 입력하면 원리합계를 계산하여 출력하게 하라.
단, 원금은 정수로 입력하며 이율은 실수로 입력한다. 이율이 음수이거나 30%을 넘으면 오류이다.
또다시 갈라지려면 .. 포함
138
139 MJU CE C Language Programming
예제
140 MJU CE C Language Programming
연습 문제
문자 하나를 입력받아 영어 소문자인지 아닌지를 판별하는 프로그램을 작성하라.
141 MJU CE C Language Programming
연습 656
정수를 입력하면 양수인지, 음수인지, 아니면 0인지를판별하여
출력하게 하라.
142 MJU CE C Language Programming
연습 657
정수를 입력하고 입력된 정수가 90 이상이면 "수" 80이상이면 "우", 70이상이면 "미", 60이상이면 "양" 아니면 "가"를 출력하는 프로그램을 작성하라.
143 MJU CE C Language Programming
연습 661
연 소득을 입력하면 이에 대한 세금을 계산하여 출력한다. 단 소득은 만원 단위 정수로 입력하고 세율은 소득에 따라서 아래와 같이 달라진다.
5000 이상 10% 4000이상 5000미만 5% 4000미만 3%
144 MJU CE C Language Programming
여러 가지 기준으로 갈라지기
x와 y의 값에 따라서
1사분면2사분면
3사분면 4사분면
145 MJU CE C Language Programming
사분면 ex662
x와 y 정수 값을 입력하면 1~4사분면 중 어디에 있는지 출력하는 프로그램을 작성하라.
단, 점이 좌표축 상에 있으면 "축"이라고 입력한다.
146 MJU CE C Language Programming
ex663 실습: 좀 더 복잡한 세금
소득세가 다음과 같이 계산된다. 소득액(만원 단위)과 나이를 각기정수로 입력했을 때 (둘 사이는 하나 이상의 빈 칸으로 구분) 세액을계산하는 프로그램을 작성하라. (세액만을 출력)
세율을 나타내는 변수는 float로 한다. 변수가 그 내용을 잘 나타내도록 이름을 짓도록 한다. 세액 = 소득 * 해당 세율 세율:
60세 미만 60세 이상
1000 이하 5% 4%
1001~2000 6% 5.5%
2000 초과 8% 7%
다음쪽에계속소득: income 세금 tax 비율 rate 나이 age
147 MJU CE C Language Programming
과제: 연말 정산 프로그램 연말 세금 계산 프로그램을 작성하라. 총 수입에서 공제액을 뺀 액수를 과세 대상 소득이라 하고, 과세 대상
소득에 세율을 적용한 것이 세금이다. 단, 세율은 단순 세율이 아니고 누진세이다. (즉 많이 번 사람은 높은 비율로 세금을 낸다.) 입력 데이터는: 올해의 소득, 부양가족 수, 신용카드 사용액, 의료비 지출, 기부금 순서로 만 단위 정수로 입력한다.
공제 내역은 다음과 같다. 본인 공제 100만원, 부양 가족 1인당 100씩 공제 신용카드는 1000만원을 초과하는 경우에만 초과 분의 10%를 공제 의료비는 수입의 5%를 초과하는 경우에만 의료비 전액 공제 기부금은 전액 공제 공제액이 소득액을 넘으면 세금은 0원
과세대상소득액 1000 이하에 대해서는 1% 1000 초과분 2000이하에 대해서는 3 % 2000 초과분 3000이하에 대해서는 10 % 3000 초과분은 20 %를 적용한다.
출력: 각 항목별 공제액(부양가족 공제, 신용카드공제, 의료비 공제 순서) 과세 대상 소득액 , 총 세금액
:: text 10장, 11장반복 구조
10,11
149 MJU CE C Language Programming
while 반복 구조
150 MJU CE C Language Programming
while 구조를 이용한 무한 반복
X순환불가
임의순환은프로그램구조를나쁘게만든다.
이조건은항상true이므로...
151 MJU CE C Language Programming
제한된 반복
5 4 3 2 1 까지만 출력되고 멈추려면 5에서 시작. 어떻게? 매번 n 값을 1 감소. 어떻게? 1까지만 되도록 조건. 어떻게?
152 MJU CE C Language Programming
while 을 이용한 제한된 반복
"for"를 이용하면 쉽다
1. 준비(prepare)
2. 계속할조건
3. 다음번반복준비
break는벗어난다는뜻
반복할내용은여기에넣는다.
while 과 for 비교
154
155 MJU CE C Language Programming
예제
i=1부터 10 까지에 대해 i의 제곱을 출력
continue를 실행하면"다음"노드로 간다.<<생략가능>>
"준비"와 "다음"은 비워도 된다.
이 경우 while과차이가 없다.
157 MJU CE C Language Programming
연습 664
1, 2, 3, …, 10 까지를 출력하는 프로그램을 제한된반복(for)을 이용하여 구현하라.
각 숫자 사이에는 빈 칸을 넣어 준다.
158 MJU CE C Language Programming
연습 665
정수를 읽어 n에 저장한 뒤 1부터 n 값 까지의 합을 변수 sum에 더하라. (변수 명 지정 필요)
159 MJU CE C Language Programming
ex666 계차 수열
1, 2, 4, 7, 11 처럼 두 수의 차이가 계속 1씩 증가하는 수열을 출력하되 출력할 값이 100이 넘으면 종료한다.
Hint: 두수의 차이를 나타내는 변수가 필요하다. 반드시 코멘트를 달도록 한다.
160 MJU CE C Language Programming
연습 667: prime number
어떤 정수를 입력했을 때, 이 정수가 소수인지 아닌지를 판별하는 프로그램을 작성하라. 소수는 1과 자기 자신 이외의 수로는 나누어 떨어지지 않는 수를 말한다.
Hint: 2로 나누어 떨어지는지 확인, 3으로 나누어지는지 확인, … n/2 으로 나누어 떨어지는지 확인. 까지만하면 된다.
예를 들어 99가 소수인지 확인 하려면 최대 49까지만해보면 된다. (왜냐면 50 이상의 수로는 절대로 나누어질 리가 없으니까)
중간에 한번이라도 나누어지면 소수가 아닌 것이고 끝까지 가도 한번도 나누어 떨어진 적이 없으면 소수인것이다.
::2중, 3중 반복
162 MJU CE C Language Programming
문제 예시: 2중 반복
입력된 정수의 크기에 맞는 숫자 삼각형을 출력한다. 예를 들어 5를 입력하였다면
1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 처럼 출력하면 된다.
163 MJU CE C Language Programming
해결책이 못 되는 것
printf "1\n" printf "1 2\n" printf "1 2 3\n" printf "1 2 3 4\n" 반복을 사용할 수가 없다.
164 MJU CE C Language Programming
쉬운 해결책: 한꺼번에 해결하려 하지 말자.
1부터 1까지 출력 1부터 2까지 출력 1부터 3까지 출력 … 1부터 5까지 출력
165 MJU CE C Language Programming
작은 덩어리
166 MJU CE C Language Programming
안으로 집어 넣는다
167 MJU CE C Language Programming
for 안에 for: 완성
변수명달라야함.
168 MJU CE C Language Programming
과제 670
정수값 n, k 에 따라 다음과 같은 정수 사각형을 출력하게 하라. n=5, k=3 이라면 답은:
1 2 3 4 5 2 3 4 5 6 3 4 5 6 7
169 MJU CE C Language Programming
671
입력된 정수의 크기에 맞는 숫자 삼각형을 출력한다. 예를 들어 5를 입력하였다면
5 4 3 2 1 5 4 3 2 5 4 3 5 4 5 처럼 출력하면 된다.
::간단한 그림 그리기(graphics)
19
171 MJU CE C Language Programming
Graphics
canvas (혹은 canvas width height) 필요 color 255 0 0 (Red Green Blue: 0 0 0 검은색) drawrect x y width height (erase) fillrect x y width height (erase) 예:
drawrect 10 10 100 100drawrect 10 10 100 100 erasefillrect 200 100 50 50fillrect 200 100 50 50 erase
172 MJU CE C Language Programming
canvasheight
canvaswidth
xy
173 MJU CE C Language Programming
도형 그리기 함수
drawoval x y width height (erase) filloval x y width height (erase) drawtext "Hello" x y (erase) drawline x1, y1, x2, y2 (erase) * erase 가 뒤에 붙으면 지우기. 시간 지연: sleep milliseconds
sleep 1000 1초sleep 500 0.5초
174 MJU CE C Language Programming
연습 문제
크기 10,10 짜리 사각형을 canvas 의 100, 100 위치에서 300,300 위치까지 5간격으로 이동하도록 그려라. 그리고 지우기까기 100ms 간격을 둔다.
175 MJU CE C Language Programming
연습 문제
작은 공 하나를 캔버스의 위쪽 적당한 곳에 떨어뜨리면일정한 속도로 내려갔다 다시 올라오도록 만들어보라. sleep을 이용해서 적당한 속도로 조절한다.
176 MJU CE C Language Programming
연습 문제(고급)
작은 공 하나를 캔버스의 위쪽 적당한 곳에 떨어뜨리면자유낙하를 하는 모양으로 내려갔다 다시 올라오도록만들어보라. 인터넷을 찾아서 시간에 따른 낙하 거리를 계산하면 된다. speed = 0.5 gt2
즉, 단위 시간에 이동한 거리는 경과 시간의 제곱에 비례한다. 화면상의 거리는 실거리가 아니므로 보기 좋을 정도로 적당한 비례 상수를 사용하면 된다.
177 MJU CE C Language Programming
random 함수
random 을 호출하면 임의의 정수가 생긴다. 이것을 적절히 나누어 나머지를 이용하면 원하는 범위
의 정수를 만들어 낼 수가 있다.
178 MJU CE C Language Programming
연습 문제
canvas 상의 임의의 위치에 가로 100 세로 200인 사각형을 그린다.100개의 임의의 점을 생성하여 (random 이용) 이 사각형 안에 있으면 위치에 작은 원을 그리고 아니면 작은 사각형을 그리도록 한다.
179 MJU CE C Language Programming
이미지 파일 그리기
* 실행하려면 png 파일이 있는 디렉토리에 cfl 프로그램을 먼저 저장해야 함.
loadimage "파일명" drawimage 번호 x y 지우려면 fillrect로. 이미지 번호는 loadimage
순서로 0,1,2…
180 MJU CE C Language Programming
연습
두더지가 구멍에서 1초에 한번씩 나왔다 들어갔다를 5번 반복하게 하라.
Hint: sleep(1000) 1초 쉬었다 가기
mole_up.png mole_down.png
::이벤트(event) 기반 프로그램
21
182 MJU CE C Language Programming
마우스 이벤트 다루기
순차적 실행이 아님 특정 이벤트가 발생되면 독립적으로 실행
(예: 마우스 클릭)
183 MJU CE C Language Programming
Event 란?
프로그램의 순차적 실행과 독립적으로 발생하는 사건 Event기반 프로그램이란?
이벤트가 프로그램의 특정 부분을 실행하도록 만들어주어서 일종의 입력 역할을 하게 하는 것.
184 MJU CE C Language Programming
이벤트의 종류
mousedown, mouseup, keydown, keyup
mousedown x y 마우스 버튼을 눌렀을 때, canvas내에서의 위치가 x y에 저장됨.mouseup x y 마우스 버튼을 뗄 때.
여기에입력하면 이런모양이된다.
185 MJU CE C Language Programming
이벤트의 종류
mousedown, mouseup, keydown, keyup
연결되어있지않음에유의하자.
186 MJU CE C Language Programming
주의사항
키의 코드 값은 대문자로 비교해야함. if ( c == 'A' ) OK if ( c =='a' ) NOT OK
187 MJU CE C Language Programming
데모:
simplemouse
188 MJU CE C Language Programming
과제
캔버스 안의 적당한 곳에 4각형을 그린다. (이 위치를기억시켜야 한다.)
마우스가 4각형 밖을 클릭하면 점수를 1점 빼고4각형 안을 클릭하면 1점을 더하도록 한다.
점수를 나타내는 변수는 알아서 지정하고 코멘트로기록해 둔다. 초기 점수는 0점으로 둔다.
189 MJU CE C Language Programming
623번 과제: 두더지 한마리 잡기
두더지 한마리를 적절한 위치에 그리고(mole_up.png - 크기는 100x110)
10초안에 클릭하면 mole_hit.png를 그리고 10초가지나면
클릭해도 소용없게 만들고, 그림을 mole_down.png로 바꾸어라.
190 MJU CE C Language Programming
실습
캔버스 내의 임의의 위치에 작은 사각형을 1초에 하나씩 만들어서 10개가 되면 멈추도록 한다.
191 MJU CE C Language Programming
게임 만들기: 두더지 잡기
캔버스 상의 9개의 정해진 위치 중 하나에 random하게 두더지를 그린다.
2초 후면 이 두더지는 숨는다. 그리고 다시 위치를 선정해서 튀어나오기를 10회 반복한다.
이때, 두더지가 튀어 나와 있는 동안에 사용자가 마우스를 제 위치에 클릭하면 점수가 1점 오르게 한다.
::소리 파일 재생하기
20
193 MJU CE C Language Programming
소리 파일 재생하기
loadsound "wav 파일명" play <번호> ... loadsound 순서대로 0번 부터
* loadsound를 실행하려면 wav 파일이 있는 디렉토리에 cfl 프로그램을 먼저 저장해야함.
::배열
12
195 MJU CE C Language Programming
번호의 좋은 점
이름 대신 번호로 지칭 반복 구조를 단순화 할 수 있음.
김선화, 이명진,홍길동,조성민,...
1번부터10번까지완전군장집합!!!
196 MJU CE C Language Programming
변수 작명의 한계: 예제 1
다섯 명의 성적 중평균보다 작은 수만출력.
197 MJU CE C Language Programming
변수 작명의 한계: 예제 2
10명이면?
198 MJU CE C Language Programming
수학에서는...
N
xxni
i2
,1)(
N
xx Ni
i ,1
아래첨자(subscript)
199 MJU CE C Language Programming
프로그래밍 언어에서는 …
첨자가 붙은 변수를 "배열"이라고 한다.
1X
nX
2X
r[1]
r[2]
r[n]
수학기호 배열기호
200 MJU CE C Language Programming
CFL array
201 MJU CE C Language Programming
진짜 장점은 반복 구조
202 MJU CE C Language Programming
연습 문제: 692
10개의 정수를 읽어서 r배열에 읽은 순서대로 저장한다. (r[0] 부터 r[9]까지 임에 주의)
저장이 끝나면 반대 순서로 전부 출력한다. hint: 다음 예를 실행해 보면 감이 잡힐 것이다.
203 MJU CE C Language Programming
연습 문제
몇 개일지 알 수 없는 (10개보다 크지는 않다) 정수를읽어서 배열 r에 순서대로 저장한다.
그런 다음 실제 개수를 n에 저장하고 n개 중에서 가장 작은 데이터를 찾아서 출력한다. 또 n개 중에서 가장 큰 데이터를 찾아서 출력한다.
204 MJU CE C Language Programming
최대치를 맨 끝으로 옮겨보자
10개의 정수를 배열 r에 읽어들인다. (r[0]~r[9]) 함수 movemax n 을 작성해서 호출한다. movemax n 은 n개의 배열 (r[0] ~ r[n-1] 중 가장
큰 것을 r[n-1]로 이동하게 한다. 방법: 인접한 것끼리 비교해서 큰 것이 뒤에 있도록 바
꾼다. 이것을 반복하면 된다. 일단은 r[0]와 r[1] 만바꾼다.
9r[0]
7r[1]
7r[0]
9r[1]
205 MJU CE C Language Programming
전체를 정렬하자
2개의 인접한 데이터를 비교하여 바꾸어 주는 함수change
N개의 배열 데이터를 비교하여 최대 값을 n-1 위치로보내는 함수 movemax
전체를 정렬하는 함수 sort
206 MJU CE C Language Programming
Searching
10개의 데이터를 읽어서 배열에 저장한다. 그 다음부터 읽는 데이터는 읽은 후 n 에 저장하고 이
수가 배열에 들어 있는 수인지 아닌지를 확인하여Yes 혹은 No 를 출력하면 된다.
데이터가 더 이상 없으면 종료한다.
207 MJU CE C Language Programming
연습 658: 데이터의 유무 판별
하나의 정수를 입력하게 하고 데이터가 준비되어 있는경우와 데이터가 없는 경우에 실행 결과가 어떻게 달라지는지를 살펴보고 설명하라.
208 MJU CE C Language Programming
연습 문제: 659
여러 개의 정수를 입력하여 각 정수마다 2를 곱하여 출력하되 데이터가 더 이상 없으면 "끝"이라고 출력한다.
예를 들어 2 3 6 8 이 입력되었다면 4 6 12 16 끝 이렇게 출력하면 된다. 출력 수 사이에는 빈칸을 두도록 하자.
209 MJU CE C Language Programming
연습: 660
입력된 정수가 홀수 인지 짝수인지를 출력하는 프로그램을 작성하라. 여러 개의 정수가 입력되는 대로 출력하되 더 이상 입력이 없으면 "끝"이라고 출력하고 마친다.
210 MJU CE C Language Programming
211 MJU CE C Language Programming
작은 정수
int i 대신에 char i로 데이터 유형을 바꿔본다. i = 257 을 실행해본다. i = 128을 실행해 본다. i = 127을 실행해 본다.
212 MJU CE C Language Programming
213 MJU CE C Language Programming
Bits view
257을 복사
0000....0000000100000001
00000001
int
char
0000....0000000000000001
214 MJU CE C Language Programming
128은 왜?
00000000 --> 0 00000001 --> 1 00000010 ... 01111111 --> 127 10000000 --> -128 10000001 --> -127 10000010 --> -126 ... 11111111 --> -1
::CFL 함수
16
216 MJU CE C Language Programming
함수란?
동일한 일을 여러 번 할 때 필요 예: 세 개의 수의 평균을 구하는 함수.
CFL functions: 동일한 일만 하는 경우
217
218 MJU CE C Language Programming
함수의 특징
외부와 연결이 없다. 함수 이름으로 호출해야 한다. "return"으로 돌아간다.
218
호출하기
입력중 입력후
Step과 Next 차이
s1s2
s3s4
n1
n2
Next 는 함수 안에서 멈추지 않는다.
221 MJU CE C Language Programming
677 (CFL)
자신의 이름과 줄 바꿈을 한번 출력하는 함수call_me 를 작성하고 2 번 호출한다.
Parameter를 전달받아서 일하는 경우
222
formal parameter
actual parameter
223 MJU CE C Language Programming
CFL 파라메터의 특징 1
상수 혹은 변수로만 작성할 것 fun a 123 Okay fun a+b+ x cos y 안됨.
* 필요하면 여러 단계로:y = a + b + xz = cos yfun y z
223
224 MJU CE C Language Programming
파라메터의 특징
함수는 실질 파라메터의 값을 변경하지 못한다.
224
이러한호출방식을 "Call by value"혹은 "값에의한호출"이라고한다. 배열은이방식을
따르지않는다.
225 MJU CE C Language Programming
ex677에 추가
파라메터로 주어진 정수와 그의 제곱을 출력하는 함수sq_print 를 작성하고 main에서는 scanf로 읽은 정수를 이용하여 호출하여보라.
출력 예시: 3 의 제곱은 9입니다.
226 MJU CE C Language Programming
3. 정수 값의 반환하는 함수
반환값(return value)
함께 써도 된다.
228 MJU CE C Language Programming
float의 반환
229 MJU CE C Language Programming
그냥 이렇게 쓰면 안되나?
생각해보기
230 MJU CE C Language Programming
연습 679 원의 면적
원의 지름을 전달하면 면적을 계산하여 돌려주는 함수circle 을 작성하고 이를 이용하여 면적을 계산하여 출력한다. 원하는 지름은 scanf로 받아들인다.* 주의1: 전달 받은 수가 반지름이 아닌 지름이다.* 주의2: 원주율은 3.14로 한다. 반환 값은 float이므로 주의.
231 MJU CE C Language Programming
파라메터의 특징
같은 변수를 써도 함수 호출시의 값은 종료시 없어짐 (데모)
232 MJU CE C Language Programming
연습 문제
정수 n 값을 전달하면 1+2+...+n 값을 계산하여 돌려주는 함수 sum을 작성하고
sum 5 sum 10 sum 100 을 호출해서 각각 결과를 출력한다.
233 MJU CE C Language Programming
정수를 파라메터로 주면 이 정수가 소수인지(prime number) 확인하여 소수이면 1을 돌려주고 아니면 0을 돌려주는 함수 "prime"을 만들고, 이를 이용하여키보드에서 입력된 정수가 소수인지 아닌지 확인하여"소수" 혹은 "소수 아님"으로 출력하게 하라.
:: For FunLED 가지고 놀기
23
235 MJU CE C Language Programming
Line형 LED 만들기
canvas 먼저 생성 led k 150 150
k 가 제어 변수. 위치 150x150 k 의 아래쪽 8비트의 값에 따라 켜지고 꺼짐.
236 MJU CE C Language Programming
Shift 연산
c = 5 // 00000101 c = c << 2 // 2비트 좌로 이동 00010100 c = c >> 1 // 1비트 우로 이동 00001010
237 MJU CE C Language Programming
연습
LED하나를 생성하여 최초에 맨 오른쪽에 하나만 켜지게 하고 1초마다 켜진 LED가 하나씩 우측으로 이동하게 하여 맨 왼쪽까지 옮긴다.
238 MJU CE C Language Programming
7-segment LED
239 MJU CE C Language Programming
LED 7-segment 다루기
seven segment LED "led7 p 700 100" 700 100 위치에 LED가 생기
고 p 변수의 2진수 값에 따라서 LED가 켜진다.
11101100
⑧
①
②
③
④ ⑤
⑥⑦
쓰레기값
240 MJU CE C Language Programming
비트에서 정수로 바꾸기
2진수 10진수로 계산해도 되기는 됨. 그보다는 8진수나 16진수가 편리함 예: 10100011 10 100 011 0243
k = 0243 첫숫자가 0이면8진수라는뜻.
241 MJU CE C Language Programming
연습
LED7 을 이용하여 0 과 1이 교대로 깜빡이도록 만들라.
242 MJU CE C Language Programming
프로젝트
두자리수의 LED timer 를 만들자. 초기 값(100 미만)을 주고 호출하면 1초마다 수를 줄
이고, 0이 되면 알람 소리를 울리도록 해보자. 1단계: 0~9 까지의 수를 표시하는 값을 배열
s[0]~s[9]에 만들어 넣어둔 다음 테스트한다. 정수를0~9까지 변경시키면서 하나의 LED에 제어변수를s[0]~s[9]까지 변경시키면서 테스트해본다.
2단계: 2자리의 LED를 만들려면 두개의 정수를 대응시키고 일정시간 마다 값을 증가시킬 수 있도록 한다.
243 MJU CE C Language Programming
단원 요구사항
플로우차트의 일반적인 개념을 알고 프로그램 아이디어를 플로우차트로 설명할 수 있어야 한다.
CFL을 실행하고 사칙 연산과 복제 연산을 이용하여 복잡한 정수 계산을 단계별로 나누어 CFL로 작성하여 실행할 수 있어야 한다.
::재귀적 함수(recursion)
18
245 MJU CE C Language Programming
단어의 뜻
recur: 되돌아가다, 반복되다. recursive : 반복되는 (recursive function call) recursion: 재귀 재귀 再歸 : 다시 돌아가다
246 MJU CE C Language Programming
함수는 자기 자신의 clone을 호출할 수 있다
"치키치키 차카차카... 펑 !"
한마리는내가처치할테니나머지는니가알아서해! 알았어.
247 MJU CE C Language Programming
복사본도 또 복사를...
한마리는내가처치할테니나머지는니가알아서해!
알았어."치키치키차카차카.."한마리는내가처치할테니나머지는니가알아서해!
펑!
알았어.
248 MJU CE C Language Programming
Recursion (재귀호출)
Stack top (최근에생긴activation record)
Stack bottom
호출
호출
호출 결과반환
결과반환
결과반환
249 MJU CE C Language Programming
호출 상태는 우측에 보인다.
첫호출직후
재귀호출직전
재귀호출직후
250 MJU CE C Language Programming
실습
임의의 void 함수를 만들어 그 안에서 자신을 또다시호출하게 해보라.
함수의 내부에서는 먼처 "치키치키"를 출력하고 그다음에 자기 자신을 호출하는 노드를 만든다. 일괄 실행하면 끝나지 않으므로 단계별로 실행하면서
몇 단계만 관찰해본다.
:: 쓸모 있는 재귀 호출을 이용하자.무한 호출을 방지하고
252 MJU CE C Language Programming
파라메터가 있는 함수를 재귀 호출
최초에 파라메터를 5로 준다. 함수에서는 받은 파라메터 값 먼저 출력한다. 출력 예시: 5마리 할당 받았습니다. 다시 같은 파라메터로 자신의 clone을 호출한다.
그후 파라메터 값을 1 감소 시키고, 새로운 값(1 줄어든) 값을 파라메터로 주어 자신의
clone을 호출한다.
253 MJU CE C Language Programming
파라메터를 변경하여 호출
최초에 파라메터를 5로 준다. 함수에서는 받은 파라메터 값 먼저 출력한다. 출력 예시: 5마리 할당 받았습니다. 그후 파라메터 값을 1 감소 시키고, 새로운 값(1 줄어든) 값을 파라메터로 주어 자신의
clone을 호출한다.
254 MJU CE C Language Programming
호출의 종료
if 를 이용하여 받은 마리수가 1이면 출력만 하고재귀 호출은 하지 않는다.
즉, 받은 파라메터가 1보다 큰 경우만 재귀 호출한다. 재귀 호출이 없는 경우는 process 노드에서 return을
해준다.
255 MJU CE C Language Programming
반환 값을 이용
return 반환 값을 이용하여 1부터 n 까지 재귀 호출을이용하여 더하는 함수를 작성하고
main에서 두번 호출하여 결과를 출력해본다.
m = add 10 printf m m = add 5 print m
256 MJU CE C Language Programming
재귀의 핵심은 재귀적 문제 정의
1+2+3+…+n 을 구하는 방법은"문제를 잘 쪼개는 것"
1 + 2 + 3 + … (n-1) + n 로 정의 되니까
나는 + n 만 돌려주면 된다.
재귀 호출의 개념도
258 MJU CE C Language Programming
좋은 함수와 나쁜 함수(1)
좋은 함수: 파라메터와 반환값 만을 사용 나쁜 함수: 파라메터가 아닌 변수를 함수가 사용
demo: bad_function
259 MJU CE C Language Programming
좋은 함수와 나쁜 함수 (2)
결과 값을 반환하지 않고 함수가 처리 함수의 유용성이 떨어짐 결과는 반환 값으로 받아서 주 함수에서 처리함이 좋다 예) 두 수의 최대값을 반환하는 함수:이를 이용하여 4개 수의 최대값을 구해서 사용할 수 있다.
두 수의 최대값을 출력하는 함수:출력 이외에 다른 용도로 쓸 수 없다.
260 MJU CE C Language Programming
좋지 않은 재귀의 사용 예
demo: bad_recursion
261 MJU CE C Language Programming
좋은 재귀
add n의 값은n이 0이면 0이고0보다 크면n-1까지의 합에n을 더한 것이다.
즉, n + add(n-1)
demo: good_recursion
262 MJU CE C Language Programming
연습 문제
Mr. 손은 혼자서는 여러마리의 요괴를 싸워서 이기지못한다. 재귀 함수로 자기 자신의 분신을 호출해서 요괴를 처리하도록 만들어보자.
파라메터 n 은 요괴의 마리수이다. n값이 0이면 아무 일 하지 않고 돌아간다(return) n>0 이면 "한마리 처치"를 출력하고,
자기 분신을 호출하는 데, 파라메터 값으로 n-1을 준다.
main에서는 sohn 5 로 호출해서 단계별로 실행되는것을 살펴보고 결과를 확인하라.
::CFL 끝.