1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.
판매자 | 프리미엄 | 판매 납포인트 | 무료 | 평점 | 0점 / 총 0명 참여 |
---|
***************************< 캠퍼스 C 강좌 >******************************
[제목] :
[코드] : campusc1-009 (초급)
[교재] : CAMPUS C (초급, Third edition) [출판사 : 책과스승]
[알림] :이 파일은 "캠퍼스 C"에서 모든 분께 공개한 "초급 강좌"입니다.
이 [알림]의 내용을 지우지 않는다면 누구에게나 임의로 복사해 줄 수
있습니다.그러나 이 강좌 내용에 대한 저작권은 "캠퍼스 C"에 있습니다.
[연락처] : 605-8662 (서울) ("캠퍼스 C", 도서출판 "책과 스승")
천리안 : go campusc
나우콤 : go lcampc
하이텔 ID : campusc
*****************************<< 목 차 >>*******************************
<1> 키보드 이야기
1> 보통키,확장키
<2> enum 에 대해서..
<3> 텍스트의 칼라(color)에 대해서
1> textattr()
2> textbackground()
3> textcolor()
**************************< 내용 시작 >********************************
<1> 키보드 이야기
***********************************************************************
1> 보통키(standard key) ,확장키(extended key)
이제 키보드에 대해서 정식으로 언급을 해 봅니다. 키보드는 두말할
것도 없이 가장 기본적인 입력장치 입니다. 마우스도 상당히 편리한 입력장
치 이긴 하지만, 아직까지는 보조입력장치 밖에 안되고 있는 실정이지요.
따라서 언젠가 얘기 했지만, 이 키보드는 모니터(화면)과 함께 콘솔
이라고 불리며 컴퓨터의 가장 중요한 부분 입니다.
그런데 이 키보드 자체도 사실은 두가지로 그 자판들을 분류해 볼
수 있습니다. 그것이 제목과 같이 "보통키(standard key)"와 ,"확장키
(extended key)" 입니다.
교재 [342쪽]부터 자세한 설명이 나와 있으므로 여기서는 핵심만 구
분하면, 키보드에서 보통 키란 "아스키 코드(부록 참조)"를 발생시키는 키를
말합니다. 아스키 코드는 전부 128개 이기때문에 전부 구별하는 것이 어렵다
고 생각될지 모르지만, 그렇지 않습니다. 보통은 자판의 "영어 알파벳"과
"숫자", 그리고 "숫자"와 같이 적혀있는 특수문자들"! @ # $ % ^ & * ( ) _
+ |" 따위들이지요. 그리고 아스키코드 중에서, 처음의 32개 글자들은 통신
을 위한 문자이기 때문에 키보드로 표현 할 수 없는 것이 많습니다. 그러나
"ESC", "Tab", "Enter" 키들은 자판에서 직접 입력할 수 있는 글자라는 것을
유심히 보세요.
그외의 글자들은 전부 특수키라고 보아도 좋은데, 특수키란 여러분
이 자판을 한번만 눌러도 2 바이트의 데이터를 발생시키는 키를 말합니다.
[342쪽]의 설명과 같이 첫 바이트는 무조건 "0x00" 코드가 오고, 두번째 바
이트는 이 교재의 부록 [537-538쪽]에 나와있는 여러가지의 코드를 발생시킵
니다.
키보드를 형태로 분류하면, 자판의 갯수에 따라 103키, 102키 등으
로 불리기도 하는데, 103키보드가 한국의 표준형으로 채택되었다고 하더군
요. 이 103키의 큰 특징은 "스페이스 키"(space key, 제일 아래 줄에 긴 키)
양쪽에 "한자" 와 "한/영" 키가 있다는 것입니다.
지난번에 이 강좌를 쓸 때는, 이렇게 잘 만들어 놓은 "한/영"키를
지원하는 프로그램들이 없어서 여태도 "shift + space"를 눌러야 한다고 개
탄을 한적이 있었는데, 요즘 나오는 응용프로그램들은 다행히 그런 키들을
잘 지원하고 있더군요. 그런데 문제는, 이미 손가락을 비비꼬면서 "shift +
space"를 누르는게 습관이 되버려서 "한/영"키를 잘 활용하지 못하겠다는 것
이지요. 이와같이 습관이란 무서운 것인 모양입니다.
좌우간 이런 키보드의 기능차이를 이해하고 실용적으로 사용하는 방
법으로 다음과 같은 프로그램이 의미하는 것을 알아보겠습니다.
main()
{
char ch;
while(1) {
printf("Good morning\n");
ch = getch();
if(ch == 0x00) /* <--- 요기 */
ch = getch();
if( ch == 0x2d) /* <--- 요기 2 */
break;
}
}
이 문제의 핵심은, 위에 표시한 " <--- 요기" 처럼, 처음 입력한 값 ch 가
0x00과 같은가를 비교하고, 만일 그렇다면 한번더 getch()를 하는 것입니다.
이때 두번째에 읽히는 getch()는 사람이 두번 누르는것이 아니라고 했습니
다. "특수키"들은 한번만 눌러도 자동적으로 두 바이트(두번 getch()를 사용
할 만큼) 데이타를 발생시킨다고 했습니다.
위에서 "<--- 요기 2" 의 0x2d는 확장키코드표를 보고 "alt + x"에
해당하는 값을 찾은것 입니다.
이런 형식은 앞으로 여러분이 스스로 프로그램이 짜더라도 항상 기
본적으로 써야 되는 부분입니다. [343쪽] (예제 1)을 꼭해보시고 연습해 보
세요.
자 이제 우리가 프로그램을 짤때, 사용자(user) 입장을 생각해야 하
는 첫 단계에 와 있습니다. 가령 우리가 게임 프로그램을 짜고 매뉴얼을 다
음과 같이 만들어 준다고 합시다. "끝내려면 ESC 키를 누르세요" 그리고 프
로그램을 다음과 같이 짜면 엉터리 입니다.
-----------------
main()
{
char ch;
while(1) {
printf("끝내려면 ESC 키를 누르세요 : ");
ch = getch();
if(ch == 0x1b) /* ESC 는 0x1b */
return;
}
}
-----------------
왜냐하면 일반 사용자들이 전부 프로그래머의 말을 착하게 잘 들어
주는게 아니기 때문입니다. 어떤 사람은 "이야기" 프로그램을 하도 많이 써
서 무의식적으로 "Alt + x"를 누를 수도 있는겁니다. 아시다시피 위 프로그
램은 그러한 특수키를 쳤을 때의 방비가 전혀 안되있습니다.
따라서 C 프로그램을 잘때는 키 입력에 대해 이미 굳어진 형식이 있
습니다. 즉 프로그래머들은 이미 "사람들이 아무키나 눌러봐야 "일반키" 아
니면 "확장키" 둘 중에 하나다" 라는 사실을 알고 있기 때문에 다음과 같이
일반적으로 입력 루틴을 만듭니다.
----------------< 상투적 표현 >--------------
main()
{
char ch;
while(1) {
printf("끝내려면 ESC 키를 누르세요 : ");
ch = getch();
if(ch == 0x00) {
ch = getch(); /* <--- 무조건 한번더 읽음 */
printf("특수키 누르지 마세요",);
} else {
if ( ch = 0x1b)
printf(" ESC키 (말잘듣는 사람");
else
printf(" ESC키 는 아니군");
}
}
}
----------------
<문> 위 프로그램에서 우리가 의도하고 있는것과 다른 "내용상 에러"(컴파일
에러가 아니고) 가 있다. 컴파일 시키기 전에 눈으로 찾아보세요.
그리고 위에서
ch = getch();
if(ch == 0x00) {
이렇게 두줄로 쓴것을 보통은 줄여서 다음과 같이 한다는 것은 설명을 안해
도 아시겠지요 ?
if((ch = getch()) == 0x00) {
여러분께서도 조금 익숙해지면 단문으로 토막토막 내서 여러줄을 쓰
는것보다 위와같이 간결하게 한줄로 쓰는것을 더 좋아하게 될겁니다. 나중에
도 얘기 하겠지만 이렇게 괄호가 중첩되서 겹겹이 나타나면 항상 제일 안쪽
괄호부터 해석해서 한겹한겹 밖으로 나옵니다.
왜 그렇게 해석해야 하는가 하면 컴파일러가 그렇게 하고 있기 때문
입니다.
***********************************************************************
<2> enum 에 대해서..
***********************************************************************
enum은 "enumerated type"(열거형)의 준말입니다.단어 뜻 그대로 쭉쭉 나열
한다는 말인데 기능은 #define 과 똑같습니다. 먼저 쓰는 형태를 살펴보면
<예 1> enum { SUN,MON,TUE,WEN,THI,FRI,SAT }
<예 2> enum { SUN = 10,MON,TUE=40,WEN,THI,FRI,SAT }
여기서도 그 유명한 블럭 "{ }" 이 쓰이는데 그 사이의 단어들은
"멤버( member)" 라고 부릅니다. 멤버들은 전부 대문자로 쓴걸 유의 하세
요. 요즘 개성 강한 신세대들, "나만의 C를 짜겠다고" 소문자로 멤버명을 표
시해도 물론 틀린것은 아닙니다. 그러나 욕먹을 각오는 하고 써야 합니다.
여기서 일종의 규칙을 다시 얘기 하면
----------------------------------------
1. 변수명은 --> 소문자,대문자 섞어서
2. #define 문은 --> 대문자 만으로
----------------------------------------
합니다. enum도 #define문과 같은것이므로 "대문자"만으로 합니다. 아래의
두 경우는 똑같은것이므로 enum의 기능을 "눈치로" 알아 맞춰 보세요
<경우 1>
#define SUN 0
#define MON 1
#define TUE 2
#define WEN 3
#define THI 4
#define FRI 5
#define SAT 6
<경우 2>
enum { SUN,MON,TUE,WEN,THI,FRI,SAT }
길게 여러줄로 쓸 것을 한줄로 묶어서 "나열(enumerate)" 했다는 것을 알겁
니다. 여기서 암기 할것은
-----------------------------------------------------------
1. 멤버 제일 처음은 0 이 할당 된다
2. 그 다음 멤버는 1 씩 증가 한다는 겁니다.
3. 특정 값이 할당되면 당연히 그 값이 들어 갑니다.(아래 예)
-----------------------------------------------------------
위 3번의 예를 살펴보면, 아래의 두가지 경우가 역시 똑같습니다.
<경우 1>
#define SUN 10
#define MON 11
#define TUE 40
#define WEN 41
#define THI 42
#define FRI 43
#define SAT 44
<경우 2>
enum { SUN = 10,MON,TUE=40,WEN,THI,FRI,SAT }
여기서 MON 이 11 이 되는걸 아시겠지요 무조건 1 씩 증가 합니다.
<숙제> [291쪽] enum에 관한 설명과 예제를 전부 풀어보세요.
***********************************************************************
<3> 텍스트의 칼라(color)에 대해서
1> textattr()
2> textbackground()
3> textcolor()
***********************************************************************
1> textattr()
여러분께서 VGA 를 쓰고 있으면 물론 칼라로 프로그램을 짤 수 있는
데, 혹시 흑백(허큘리스)를 가지신 분은 이 내용을 실험하지 못 하겠군요.
[347쪽] 윗부분의 조그만한 프로그램을 입력하고 그걸 실행시켜 보세요.
여기서 textattr()이라는 함수가 처음 나왔는데 이것은 라이브러리
에서 칼라로 프로그램을 짜고 싶은 사람을 위해 만들어준 것 입니다. [522
쪽]을 보면 이 함수의 사용법이 자세히 나와 있는데, 쓰고 싶은 칼라를 숫
자로 표시하여 "이 색깔로 찍겠어" 하고 textattr() 함수를 부르는것 입니
다. 그러면 그다음 부터 cprintf(),cputs(), putch(), getche(), cscanf()다
섯개 함수를 이용하면 칼라로 화면에 찍을 수 있습니다.
cprintf() 라는 함수는 printf()와 똑같지만 textattr() 과 같이 칼
라를 쓸 때는 cprintf() 를 써야 색깔이 표시됩니다. 마찬가지로 스트링을
찍는 전용 함수인 puts()을 쓸 때도 cputs()을 써야 합니다.
그 모든 칼라의 경우가 [346쪽] 아래에 나와 있습니다. [표]를 보면
칼라는 "한 바이트" 로 표시하게 되있습니다. 이건 무슨 뜻인지 여러분도 아
시겠지요 ? 즉 우리가 표현할 수 있는 칼라(정확하게는 속성(attribute))가
0xff개, 즉 256각형 주사위 중에 하나라는 겁니다. 이 주사위를 굴리면 어떤
색깔이건 표시 되게 되있습니다.
위에서 실행시켜 본 프로그램은 0x00 부터 0xff 까지 모든 칼라를
순서대로 찍어 본것입니다.
[523쪽]의 표를 보는 법은 다음과 같습니다.
(1) 어떤 글자를 깜박이게 하고 싶으면 bit 7에 1을 씁니다. 이때 당연히 0
을 쓰면 깜박이지 않는것이지요.
(2) 배경색이란 글자를 뺀 주위 부분을 말합니다. 이것은 3비트가 할당되 있
기 때문에 8가지의 표현이 가능한데, 표에는 0 부터 7 까지 할당되있습니다.
(3) 글자색은 말그대로 글자색(전경색)을 말하는 것인데, 이것은 4 비트가
할당되 있기 때문에 16가지의 컬러를 지정할 수 있고 표에서 0 부터 15 까지
할당되 있습니다.
이제 이 값들을 이용하여 다음과 같은 색깔을 직접 만들어 봅시다.
1. 깜박이고 --> 1
2. 빨간 바탕에 --> 100 ( 4를 이진법 3 비트로 표현함)
3. 파란 글자로 --> 0001 ( 1를 이진법 4 비트로 표현함)
이걸 옆으로 주섬주섬 꿰맞추면 1 100 0001 --> 0xc1 이 되고 이걸 화면에
써보면 다음과 같습니다.
-----------------------------------
#include <conio.h>
main()
{
textattr(0xc1);
cprintf("My first color");
}
-----------------------------------
이렇게 쓰는것이 기본적인 내용이지만, 이렇게 하면 0xc1이 무슨 색깔인지
쉽게 이해가 되지를 않지요 ? 그래서 실제로는 이렇게 숫자로 않쓰고 다음
과 같은 방법으로 보기 쉽게 하려는 노력을 합니다.
#include <conio.h>
#define BLNK 0x80 /* 1000 0000 blink */
#define NO_BLNK 0x00 /* 0000 0000 */
#define B_RED 0x40 /* 0100 0000 B_ 는 background 의미 */
#define F_BLUE 0x01 /* 0000 0001 F_ 는 foreground 의미 */
main()
{
textattr( BLNK | B_RED | F_BLUE );
cprintf("My first color");
}
이렇게 하면 한결 우리 머리가 가벼워지고 내용을 이해하기 쉬워 졌지요 ?
여기서 비트 단위 OR "|" 를 아직도 모르는 분은 없겠지요 ? (모르시는 분
은 연습하고 오세요.)
<숙제> 위에서 나머지 글자색및 배경색을 전부 #define을 써서 정의 하고,그
걸 써서 "파랑 바탕에 노란 글씨"로 자기 이름(영문)을 화면에 써보세요
<숙제> 바로 위 숙제를 enum을 써서 정의 하고 다시 해 보세요.
<참고> 글자가 "깜박거린다"를 "blink"라는 용어로 씁니다. 그리고 한글에
서는 "깜박이는" 속성이 지원이 안되는데 이 비트의 위치는 한글이 영문 아
스키와 구별하기 위해서 1을 써넣는 곳이기 때문입니다.
-----------------------------------------------------------------------
2> textbackground()
이 함수의 기능은 위에서 우리가 살펴본 "글자의 속성"중에서 "배경
색"만 변경하는 일을 합니다. 다시 말해서 [523쪽]쪽]) 표의 한바이트중 "배
경색"에 해당하는 값만 변경 시킨다는 뜻이지요. 그러니까 textattr()의 함
수만 알면 이걸 사용할 필요는 없지만 "터보 C" 회사에서 친절하게 만들어
주었군요.
예를 들어 보면 "빨간 바탕에다가 글자를 쓰고 싶다(글자색은 상관
안함)"면 다음과 같이 프로그램 합니다.
#include <conio.h>
main()
{
textbackground( RED); /* <--- 요기 <문제> */
cprintf("My first color");
}
-----------------------------------------------------------------------
3> textcolor()
이 함수의 기능도 [523쪽] 표의 한 바이트 중에서 "글자색"과 "깜박
임"만 변경하는 일을 합니다.
예를 들어 보면 "파란 글자를 쓰고 싶다(바탕색은 상관안함)"면 다
음과 같이 프로그램 합니다.
#include <conio.h>
main()
{
textcolor( BLUE ); /* <--- 요기 <문제> */
cprintf("My first color");
}
그러니까 textattr() 대신에 textbackground() 와 textcolor()를 동
시에 쓰면 똑같은 기능을 하는 것입니다. 이걸 동시에 쓰면 읽기에 더 편할
지도 모르겠습니다. 속도는 다소 느려지겠지요 ? 이런건 본인에게 편한걸 써
도 누가 욕할 사람은 없습니다.
여기서 한가지 중요한건 위 프로그램에서 textcolor( BLUE ); 라고
썼는데 여기서 "BLUE"에 대한 정의는 우리가 한적이 없습니다. 그럼에도 불
구하고 이 프로그램은 잘못 된게 아닙니다. 왜냐하면 "BLUE"에 대한 정의가
이미 <conio.h>에 되있기 때문 입니다. 그것이 [523쪽] 중간에 선언된 enum
입니다.
<숙제> 지난 회에 입력한 "키 입력 프로그램"에서 화면의 출력 부분을 전부
본인이 원하는 컬라로 바꿔서 작품을 만들어 보세요.
<숙제> 위의 작품을, 보내드린 "메뉴 선택 프로그램"에 첨가 시키고, 나름대
로 작품을 만드는 작업을 해보세요.
**************************< 끝 맺으며 >********************************
수고하셨습니다.
***********************************************************************