회원가입 ID/PW 찾기

1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.

콘텐츠 수 1,041

캠퍼스 C 강좌_9

펌웨어 & 코딩언어 구매수 0 2007.11.04 23:19:10
판매자 프리미엄 판매 납포인트 무료 평점 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
입니다.

<숙제> 지난 회에  입력한 "키 입력 프로그램"에서 화면의 출력  부분을 전부
        본인이 원하는 컬라로 바꿔서 작품을 만들어 보세요.
<숙제> 위의 작품을, 보내드린 "메뉴 선택  프로그램"에 첨가 시키고, 나름대
로 작품을 만드는 작업을 해보세요.
**************************< 끝 맺으며 >********************************
수고하셨습니다.
***********************************************************************

 


profile
외뿔공룡 2008.10.11 12:20
자료 감사합니다.
profile
초코우유 2009.08.19 15:23
좋은 자료 고맙습니다.
profile
한틀 2009.11.02 11:17
좋은 자료 감사합니다.화이팅~!
profile
용정 2010.01.15 15:54
좋은자료 감사합니다.
profile
안다솜 2010.02.03 13:49
감사합니다.
profile
시나브로69 2017.06.24 15:44
좋은 자료 감사합니다.
search
List of Articles
번호 분류 제목 평점 포인트 판매자 등록일 구매수 조회 수
공지 공공의 목적으로 공유하고자 하는 소프트웨어는 '소프트웨어 자료실'에 업로드를 요청드립니다.
공지 구매후 평점 댓글을 남겨주시면 구매포인트의 20%를 돌려드립니다.
281 펌웨어 & 코딩언어 캠퍼스 C 강좌_14 [2] 무료 프리미엄 2007-11-05 0 966
280 펌웨어 & 코딩언어 캠퍼스 C 강좌_13 [2] 무료 프리미엄 2007-11-05 0 1053
279 펌웨어 & 코딩언어 캠퍼스 C 강좌_12 [4] 무료 프리미엄 2007-11-05 0 1008
278 펌웨어 & 코딩언어 캠퍼스 C 강좌_11 [3] 무료 프리미엄 2007-11-05 0 1021
277 머신러닝, AI & 알고리즘 (10) matlab M-file 작성 시 유용한 함수 [2] 무료 프리미엄 2007-11-05 0 1995
276 머신러닝, AI & 알고리즘 (9) matlab 다차원 배열(multidimensional array) [1] 무료 프리미엄 2007-11-05 0 3548
275 머신러닝, AI & 알고리즘 (8) matlab subfunction과 다차원 배열 [2] 무료 프리미엄 2007-11-05 0 2223
274 펌웨어 & 코딩언어 캠퍼스 C 강좌_10 [4] 무료 프리미엄 2007-11-04 0 1072
» 펌웨어 & 코딩언어 캠퍼스 C 강좌_9 [6] 무료 프리미엄 2007-11-04 0 1309
272 펌웨어 & 코딩언어 캠퍼스 C 강좌_8 [7] 무료 프리미엄 2007-11-04 0 1294
271 펌웨어 & 코딩언어 캠퍼스 C 강좌_7 [9] 무료 프리미엄 2007-11-04 0 1101
270 펌웨어 & 코딩언어 캠퍼스 C 강좌_6 [9] 무료 프리미엄 2007-11-04 0 1357
269 머신러닝, AI & 알고리즘 (7) matlab 제어문과 debugging요령 [1] 무료 프리미엄 2007-11-04 0 1868
268 머신러닝, AI & 알고리즘 (6) matlab의 M-file이란 무엇인가? [2] 무료 프리미엄 2007-11-04 0 1720
267 머신러닝, AI & 알고리즘 (5) Matlab의 연산자(operators) [1] 무료 프리미엄 2007-11-04 0 2272
266 머신러닝, AI & 알고리즘 (4) Matlab의 행렬의 거듭 제곱 [3] 무료 프리미엄 2007-11-04 0 3597
265 머신러닝, AI & 알고리즘 (3) Matlab의 행렬연산을 전반적으로 정리 [2] 무료 프리미엄 2007-11-04 0 1649
264 머신러닝, AI & 알고리즘 (2) matlab으로 행렬을 다루는 전반적인 내용 [5] 무료 프리미엄 2007-11-04 0 1522
263 머신러닝, AI & 알고리즘 (1) 왜 Matlab을 배워야 하는가? [18] 무료 프리미엄 2007-11-04 0 1891
262 펌웨어 & 코딩언어 캠퍼스 C 강좌_5 [10] 무료 프리미엄 2007-11-04 0 1458
  • 누구도 자기가 하는 말이 다 뜻이 있어서 하는 것이 아니다. 그럼에도 자기가 뜻하는 바를 모두 말하는 사람은 거의 없다.
    - H.애덤즈
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.