2011년4월4일...if문, if-else문, 다중if문, switch문, 마인드스톰 로봇대전

시간 순서로 적고 후에 내용별 정리 카테고리를 추가하거나 색인포스트를 작성할 것.

 

1. if문 (예제 3-4)

조금 비유가 어긋나긴 하였지만 수문을 제어해 열리면(참) 수문을 통해 물이 흘러 들어와 수차를 돌리고 빠져나간다. 수문이 닫히면(거짓) 수문에 막혀 수차로 물이 흘러 들어갈 수 없어 수차는 돌지 않음.

프로그램에서 if문의 조건식이 참이면 if문 안의 명령문들을 실행하고 빠져나감.
그러나 조건식이 거짓이면 if문 안의 명령문들을 실행하지 않고 위에서 부터 차례대로 실행됨.

 

●플로우 차트(흐름도, 순서도)

 

 

시간 iNum1입력 iNum2입력 iNum1메모리 iNum2메모리 iBigger메모리
1 10 20 10 20 10
2     10 20 20
3 20 10 20 10 20
4     20 10 20

 

iBigger에 iNum1의 값을 일단 집어 넣고 iNum1과 iNum2를 비교하여 iNum2이 클 경우 큰 수는 iNum2이므로 iBigger에 iNum2를 집어 넣고 아니면 if문을 수행하지 않는다. 공통으로 마지막에 iBigger를 출력한다.

 

  

상기의 세 가지 도형만 쓰고 나머진 잘 안 쓴다.
그리고 보안프로그램의 경우 선택문(판단)이 많이 들어 가므로 이번에 학습할 내용은 조금 더 중요하다 할 수 있다.

흐름도란 “어떻게 움직일 거냐?”는 논리적인 흐름도로 문법적이지 않고 간결하고 명확하게 작성하면 된다.
즉, 다음과 같이 인생을 표현하자면…

※상기의 흐름도는 재테크에 한정되어 있어 노동은 포함시키지 않는다.

누구나 자신의 인생이 시작되었다는 것을 오감을 통해 알 것이다. 오감이 없는 분들은 자신의 사고로 내면적인 세계에서 신과 소통하며 알게 될 것이다. 부모 또는 사회의 도움을 받아 최소한 팬티 한 장은 상속받는다.

주식에 투자해서 성공하면 워렌버핏과 같이 부유한 삶을 산다.
                    실패하면 가난한 삶을 살게 될 것이다.
부동산에 투기해 땅에서 10억배럴의 원유가 발견된다면 매우 부유한 삶을 살게 될 것이나,
                    지구온난화의 영향으로 사막이 되어 버려 근처에 아무도 살지 않게 되면 가난한 삶을 살게 될 것이다.
부자든 거지든 모두 삶의 최종목적지는 죽음…즉 영원한 안식처로 가는 것이다.
어떤 종교든 죽음 뒤에 영원한 삶이 있다고 한다. 죽어 보면 알 것이니 고민하지 말자.

 

★디지털 치매
인터넷에 많은 자료가 있고 언제든지 검색이 가능하므로 자료를 찾아보고 외우려는 노력을 하지 않아 잊어버림.
프로그래밍은 미학이 필요하며 좌뇌(이성), 우뇌(감성) 모두 발달해야 애플사의 아이폰과 같은 걸작이 나온다.
왼손은 거들뿐인데 ㅠㅠ

 

2. if문내 복합문 (예제 3-5)

 

시간 iNum1입력 iNum2입력 iNum1 iNum2 iBigger iSmaller
1 10 20 10 20 10 20
2     10 20 20 10
3 20 10 20 10 20 10
4     20 10 20 10

 

iNum1과 iNum2를 입력 받아 일단 iBigger에 iNum1을 iSmaller에 iNum2를 입력한 후에,
iNum1과 iNum2를 비교하여 iNum2가 크면 iBigger에 iNum2를 넣고 iSmaller에 iNum1을 넣는다.
결국, 큰 수가 iBigger에 들어가게 된다.
이 예제는 if문 내에 중괄호{ }로 묶어 여러 줄의 명령문을 넣을 수 있다는 것을 알려준다.
명령문이 한 줄이라도 중괄호{ }를 넣을 것. 그래야 다른 사람이 보더라도 이해하기 쉽다.

결과는 같으므로 출력결과의 스크린샷은 생략함.

 

3.if-else문

 

 

 

 

 

 

 

 

○if문
밥 먹고 집에 갈래?
(안 먹어도 집에는 간다.)

○if-else문
밥 먹을래? 빵 먹을래?
 

 

 

 

 

 

●if(num1 < num2)을 CPU가 하는 일로 풀어서 순서대로 정리 (시간나면 도식추가)
① 메모리에서 num1의 값을 읽어와 레지스터에 저장. mov cx, [num1]
② 레지스터에 메모리에 있는 num2의 값을 빼서 저장하지 않고 부호비트만 바꿈. cmp cx, [num2]
③ 부호비트가 0이면(음수가 아니면) if문 끝으로 점프(분기) jge 프로그램메모리주소(ex: SHORT $L342)
※분기는 함수에서 하고 어셈블리어도 나중에 함.

이성재氏의 생각
① num1의 값을 가져온다.
② num2의 값을 가져온다.
③ num1의 값이 num2의 값 보다 작으면 참(1)
④ num1의 값이 num2의 값 보다 크면 거짓(0)
※아직 어셈블리어를 배우지 않았으므로 이성재氏의 답은 틀린 것이 아니다. 지금 하려는 의지가 중요한 시기.

①번과 ②의 순서가 중요한데 다음과 같이,

임베디드 시스템에서 센서1의 값을 읽어와 일을 처리하고 센서2의 값을 읽어와 비교하면 센서1의 값은 과거값이 된다.
task가 없어도 센서1과 2를 동시에 읽어 들이는 하드웨어적인 구성이 아니면 센서1의 값은 과거값이다.
아직 이 말씀에 대한 이해가 되지 않는다. 그리니 일다 필기만 해놓자.


★비교와 계산의 차이

인간은 상기의 그림과 같이 숫자를 비교할 때 제일 높은 자리부터 큰가 작은가 판단을 하고,
산술연산시엔 제일 낮은 자리부터 시작한다.

컴퓨터는 인간을 연구하여 나온 결과물이라 인간과 같이 계산하고 비교한다.


비교는 num1에 num2를 빼서 결과가 음수이면 num2가 큰 것이고,
                                             양수이면 num1이 큰 것이고,
                                             0이면 같다는 말씀을 하실 줄 알았다.

 

4.예제 3-6

주석에도 있듯이 예제3-5를 수정한 프로그램이라 설명은 생략.

 

 

★if문에 -100을 넣어보자.

조건식이외에도 상기의 그림과 같이 –100,0,1,-1.1같은 값을 넣을 수 있고,
0이외에는 모두 참인 것을 알 수 있다.

 

 

5. 다중if문

 

A학점의 경우 한 번만 비교를 하면 되니 A학점 범위인 90이상 100이하의 점수를 입력했을 때가 제일 빠르다.
빈도가 높은 항목을 먼저 쓰면 좋겠다. 

 

★조건식에서 숫자는 왼쪽에 두고 변수를 오른쪽에 쓰면 실수로 ‘=’을 하나 입력하였을 때도 컴파일이 되지 않아 문법적인 에러를 쉽게 찾을 수 있으나 변수를 왼쪽에 쓰면 항상 오른쪽의 숫자가 대입되므로 같은 명령문만 실행된다.
예전에 이런 문제로 많은 시간을 허비한 생각이 났다.

if(x==0)을 잘 못 쓰면 if(x=0)이 되어 x에 0을 대입하고 그 값은 항상 0이므로 실행하면 원하는 동작이 되지 않으나,
if(0==x)를 잘 못 쓰면 if(0=x)가 되어 컴파일 시에 문법적인 에러를 낸다.

 

 

 

오른쪽의 실행결과창은 깊이를 알 수 없는 검은색의 캄캄한 나의 미래를 보는 것 같다.


6.다중if문에서 else와 if의 짝짓기



임베디드C p.83 다중if문에서 if와 else의 짝짓기의 a)소스코드를 풀어 쓰면 오른쪽 코드와 같이 되어 보기가 좋다.
명령문이 하나라도 중괄호로 묶어주는 것이 좋다. 회사에서 쓰지 말라고 하면 안 쓰면 됨.
먼저 height가 160이상인 경우에 다음 if문을 확인함. 다음 if문에서 height가 195이하이면 pass가 1이고,
                                                                                         height가 195를 초과하면 pass가 0이된다.


7. switch문




















switch문은 정수형 변수를 넣으면 된다.
상수를 넣으면 항상 그 case만 동작하니...
case다음에 콜론이 아닌,
세미콜론이다.

라벨은 표시로 명령문이 아니다.
case에는 상수만 넣어야 한다.
(문자상수 포함)
break는 switch문을 탈출하라는 명령.


default는 위에 case들을 모두 만족하지..
못 하였을 경우 실행이 된다.
그런데 여기에 break;가 필요한가?










8.마인드스톰 로봇결투

준비1시간
토너먼트
지금까지는 NXT 그림을 나열해서 했다.
다음에는 NXC (Not eXactly C) Tribot 만들어 함.





(설명은 나중에 >_< 바쁘다 바뻐)




(동영상)


























어느 팀이 이겼나? 모르겠다.