2011년4월5일...if문, switch문, BricxCC (마인드스톰 Tribot)
★들여쓰기 (Indentation)
들여쓰기는 상위의 명령문에 종속된다는 의미로 인간이 보기 좋으라고 하는 것이다.
기계어로 번역되지 않아 프로그램의 내용과는 상관이 없지만 프로그램의 이해력을 높이는데 대단히 중요함으로 반드시 습관화하여 지켜야 한다. 들여쓰기는 프로그래머마다 약간 차이가 있을 수 있다.
다른 사람의 소스도 읽을 수 있게 들여쓰기가 엉망인 소스도 알아야 한다.
★break문
제어문(while, switch, for) 내에서만 사용되며 선택문 밖으로 탈출하지 자동차의 브레이크처럼 프로그램이 정지하는 것은 아님.
if문에 넣으면 다음과 같은 에러가 난다.
컴파일러는 14번째 행의 break가 불법…잘 못 사용되었다는 에러메세지를 출력한다.
main() 에서 break문이 있어도 마찬가지로 같은 에러메세지가 출력된다.
1. TEST (if문과 switch문을 이용해 학점을 구하는 프로그램)
책을 덮고 다음과 같은 요구사항을 만족하는 프로그램 작성하시오.
ⓐ키입력으로 0~100까지의 정수만 입력된다고 가정.
ⓑ100~90 –> A학점
89~80 –> B학점
79~70 –> C학점
69~0 -> F학점
ⓒ변수는 하나만 선언하여 입력받음. iNum
http://codepad.org 에서 소스코드를 보기 좋게 바꾼 것. (실행도 되니 한 번 해보시라)
[스크린샷] if문으로 구성된 프로그램 결과 [스크린샷] switch문으로 구성된 프로그램 결과
if-else if문은 어제 했으니 설명은 생략하고 switch문에서 case에 상수대신 조건식이 들어갈 줄 알고 코딩 하여 컴파일하니 에러나 났다.
그래서 고민하고 있는데 선생님께서 switch문 전에 어떤 처리를 해서 iNum의 값을 바꿔 집어 넣으면 된다고 힌트를 주셨다.
100을 나누면 어떨까 했는데 100으로 나누면 99이하는 0이 되어버려 안 되는 것을 직감적(?)으로 알았다.
10을 나무면 100은 10이 되고 90은 9가 되니 될 것 같아 iNum의 값을 10으로 나눠 다시 넣고,
case 10:에 A학점 출력 case 9:에 A학점, case 8:에 B학점 이렇게 하니 잘 되었다.
후에 case 10:에 있는 출력함수는 필요 없이 break만 넣으면 된다는 사실도 알게 되었다. (프로그램의 흐름은 위에서 아래로.)
책을 펴고 예제3-8을 보니 똑같은 프로그램이지 아니한가? 예습을 하라는 뜻인 것 같다.
상기의 스크린샷 두 개를 비교해 보면 switch문은 101~109 (10으로 나누어 10이 되는 모든 수)를 입력하면 A학점으로 나온다.
요구사항ⓐ에서 0~100까의 점수만 입력된다고 가정하였기 때문에 큰 문제는 없으나 두 프로그램은 완전히 같지 않다는 것을 증명한다.
switch문과 if문으로 짜여진 두 프로그램은 ⓐ요구사항에서처럼 입력 값이 0~100까지 라고 한다면 같은 결과가 나온다.
이에 대해 아래의 별표와 같이,
★if문과 switch문의 속도차
같은 논리라도 컴파일 단계에서 기계어로 번역되는 방식의 차이로 다르게 번역되어 옛날에는 if문이 switch문 보다 속도가 빨랐으나 지금 컴파일러 버전업으로 달라졌을 수도 있다. (VS 6.0 –> VS2005 –> VS2008 –> VS2010)
PC는 실시간 응답을 요하는 프로그램이 거의 없어 속도차를 논하는 것은 배부른 소리이나,
임베디드 시스템에선 대부분 실시간 응답을 요하는 응용이라 약간의 속도차도 큰 문제가 될 수 있을 것 같다.
2. switch문을 이용해 학점을 구하는 프로그램 (예제 3-8)
1번의 switch문과 같은 학점을 구하는 프로그램이고 D학점이 추가되었다. switch문의 마지막 default에 break문은 왜 있을까?
한 번 없애 보았는데 잘 된다. break문으로 탈출하는 것과 바로 다음 ‘}’ (중괄호)로 나가는 것이 같기 때문이다.
3. switch문 case에 ASCII값을 넣어서 문자입력 분기 (예제3-9)
문자 입력 –> case ‘0’ 또는 case 48 -> 메세지출력
* 마지막 default문에 break가 없다.
문자 | ‘0’ | ‘1’ | ‘2’ | ‘3’ | ‘4’ | ‘5’ | ‘6’ | ‘7’ | ‘8’ | ‘9’ |
ASCII (십진수) | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
문자 ‘2’ – ‘1’ = 1
숫자 2 - 1 = 1
ASCII도 각 1씩 차이남. 숫자에 48을 더하면 각 해당하는 문자가 됨.
‘0’ + 2 = ‘2’
48 + 2 = 50
char A = 50;
char B = ‘2’;
모두 50이라는 값이 저장됨. 컴퓨터는 숫자만 다룸. (0과 1)
printf(“%c\n”, A); 숫자 –> ASCII –> 화면에 문자출력
printf(“%d\n, B); 숫자의 각자리 –> ASCII –> 화면에 문자출력
4.문자입출력 함수 getchar(), putchar() (예제 3-10)
getchar() 키보드로부터 하나의 문자를 입력 받음. (1Byte ASCII얻음.)
putchar() 하나의 문자를 출력.
ch = getchar(); 키보드입력이 될 때까지 대기 (Block)
이 부분이 키보드입력으로 대체됨.
키보드입력은 모두 문자 –> 변환 –> 메모리에 숫자로 저장됨.
키보드 | A | B | C | 0 | 1 | 2 | 3 |
메모리 | 65 | 66 | 67 | 48 | 49 | 50 | 51 |
scanf(“%d”, &ch); scanf에서 문자 –> 숫자로 번역 (%d)
숫자 1234(10) -> 0x04 0xD2
문자 ‘1’ ‘2’ ‘3’ ‘4’ -> 0x31 0x32 0x33 0x34
숫자 1234는 2Byte의 메모리를 차지하고 문자 1234는 각 1Byte씩 4Byte를 차지한다.
문자' ‘1’ ‘1’ ‘2’ ‘3’ ‘5’ ‘6’ ‘7’ -> 0x11 0x24 0xEF -> printf(“%d”, …) –> 문자로 바꿔 출력
인간 | 키보드 | getchar() | 변수(메모리) |
A┘ | ‘A’ | 65 | 0100 0001 |
1┘ | ‘1’ | 49 | 0011 0001 |
인간이 키보드의 A키를 누르면 키보드는 컴퓨터로 문자 ‘A’를 전송하고 getchar()는 그 값을 65로 바꾸어 변수에 저장함.
그 변수는 메모리에 위치하고 있으며 이진수 0100 0001이다.
C언어에서 ‘0’이라고 소스코드를 짜도 어셈블 전 단계에서 48로 바뀐다. (문자 –> 숫자)
● putchar()는 printf(“%c”, …)와 같이 둘 다 한 문자만 출력함.
getchar()와 putchar의 장점은 간단하여 실행속도가 빠르다는 것이다.
★ scanf()는 조금 문제가 있다. (잘 모르겠다.)
★도스창에서 ASCII값을 입력받기
Alt키를 누른 상태에서 숫자키패드에 코드(ASCII의 십진수) 입력.
Alt + 4 + 8 -> ‘0’
Alt + 6 + 5 -> ‘A’
5.문자입출력함수 getchar(), putchar()연습 (선생님의 말씀을 듣고 작성)
“말귀를 잘 알아 들어야 한다”는 말씀이 기억나 딴 짓(생각)하지 않았다. 쿠쿠쿠
6. 마인드스톰 Tribot
험난한 1시간의 조립과정을 거쳐 Tribot Driving Base가 완성되었다.
오른쪽은 특별 개조한 공 담는 통.
진우가 프로그래밍하는 동안 심심해서 지게차와 비슷한 리프트(?)를 만들어 보았다.
바닥으로 힘차게 내리면 뒤집힌다.
7. BricxCC 다운로드와 설치 (선생님 공유폴더로 설명하면 곤란하니 공식사이트)
http://sourceforge.net/projects/bricxcc/files/bricxcc/에 접속하여 마지막 버전을 받는다. 왜? 좋으니까…
3.3.8.9가 2011년4월7일에는 마지막 버전이군…흠…
외국사이트라 그런지 속도가 느리다. 다른 일을 하고 있자.
실행하면...
설치할꺼니까 NEXT...
라이센스 동의 안 하면 설치가 되지 않으니 Yes..
이름과 소속은 그리 중요하지 않다. Next...
설치경로...Next
일반설치하고 Next...
시작메뉴...Next
복사 전에 최종확인하고 Next...
용량이 그리 크지 않으니 오래 걸리지 않는다.
8.BricxCC연습
귀여운 로봇모양의 아이콘이 생겼다. 더블클릭...
NXT컨트롤러와 PC를 USB로 연결한 후에 OK버튼을 누르자.
상기와 같은 멋진 개발환경의 인터페이스화면이 뜨고...
NEW아이콘 (백지A4지모양)을 클릭하여 소스를 작성한 뒤에...
노란 기어와 파란 기어 두개가 겹친 모양의 아이콘을 클릭하면 컴파일이 된다.
기어는 컴파일(F5)
역삼각형은 다운로드(F6)
초록플레이버튼 모양은 실행(F7)
빨간 엑스표 정지버튼 모양은 정지(F8)
만약 NXT와 통신연결이 되지 않았을 경우 Find Brick풀다운메뉴가 활성화된다.
상기의 프로그램을 컴파일하여 다운로드한 뒤에 실행하면 아래와 같이 직진하다 4초 후에 후진한다.
상기의 프로그램을 컴파일하여 다운로드한 뒤에 실행하면 아래와 같이 직진하다 0.8초 후에 턴한다.
다이렉트 컨트롤로 리프트 조정...
9. 선생님의 요청(?)
직진하다 좌로 유턴하고 다시 직진하다 우로 유턴 다시 직진하다 뱅글뱅글...
아래와 같이 처음에 잘 되어 같은 프로그램으로 여러 번 시도 하였으나 모두 결과가 다르다. 왜 그럴까?
'내장형하드웨어 > 일일보고서' 카테고리의 다른 글
2011년4월7일...symbol table(메모리), 디버깅 변수값확인, 마인드스톰 Tribot light sensor (0) | 2011.04.07 |
---|---|
2011년4월6일…while문(반복문), VS6.0에서 디버깅모드, 마인드스톰Tribot touch (0) | 2011.04.07 |
2011년4월4일...if문, if-else문, 다중if문, switch문, 마인드스톰 로봇대전 (0) | 2011.04.04 |
2011년4월1일...부가연산자, cast연산자, escape sequence, 제어문, 선택문, 마인드스톰 AlphaRex (0) | 2011.04.04 |
2011년3월28일...변수, 메모리, scanf(), 정수 자료형, 상수, 마인드스톰 Spike (0) | 2011.04.03 |