2011년3월30일...ASCII, 문자, 문자열, 마인드스톰 spike 검은 라인따라가기

1. 정수의 자료형

char  (1Byte) – 문자형, 주로 ASCII저장. 255이하의 작은 수. (문자의 크기는 1Byte)

short (2Byte) ┐

int    (4Byte) ┘여기도 문자저장가능.  이것은 생각해 본 적이 없음.

 

2. ASCII (American Standard Cord for Information Interchange)

              미국         표준      코드           정보           교환

 

컴퓨터와 컴퓨터 사이에 정보를 교환하기 위해 정해진 코드.

 

 

1~31까지는 제어문자로 화면에 출력되지 않는다.

0은 Null문자

ASCII 표를 보고 ‘A’와 ‘a’를 찾아보자.

‘A’ –> 65, ‘a’ –> 97

 

 

3. 아스키코드를 십진수로 출력하기

 

/***************************************************************

                 ASCII to decimal (20110330_ASCII)

***************************************************************/

#include <stdio.h>

 

int main()
{
    char cText;

    printf("아스키, 문자 -> 숫자\n\n");
   
    cText = 'A';
    printf("A = %d\n",cText);

    cText = 'a';
    printf("a = %d\n",cText);

    cText = '@';
    printf("@ = %d\n",cText);

    cText = 'R';
    printf("R = %d\n",cText);

    cText = '\\';
    printf("\\ = %d\n",cText);    //역슬래시(\)를 표시하려면 두 개 연달아 써야함.

                                           //역슬래시를 만나면 뒤에 오는 문자를 해석하지 않는다는 것으로,

                                           //A = ‘\’; 이 것은 A = ‘; 이렇게 해석됨. (컴파일러)

    return 0;
}

 

 

4. 교과서 예제2-10

/***************************************************************************************************************

  8진수, 10진수, 16진수를 이용한 문자의 출력과 escape sequence를 이용한 문자출력 (20110330_ex2-10)

****************************************************************************************************************/

#include <stdio.h>

 

int main()
{
    printf("10진수 65: %c\n",65);    //A문자
    printf("16진수 40: \x40\n");    //@문자
    printf("8진수 73: \073\n");    //세미콜론
    printf("백슬래쉬 \\, 작은 따옴표 \', 큰따옴표 \"\n");
    printf("2 bell sound \a\a\n\n");    //A문자
   
    printf("공백문자가\n\0 앞에 있음.\n");
    printf("백스페이스가 마지막에 있어요\b\n");
    printf("\f");               //새 페이지로 슝 :) 안되네
    printf("다음 줄로 두 번\n\n");
    printf("현재 행의 처음으로\r처음처럼\n\n");

    printf("수평탭\t수평탭\t\n");
    printf("수직탭\v수직탭끝\n\n");           //안 됨.

    printf("아스키코드128 = \x80");


    return 0;
}

 

 

 

‘\a’의 경우 화면에 표시되지 않고 PC내부스피커로 비프음을 낸다.

‘\f’와 ‘\v’는 각 여성, 남성을 상징하는 표시로 나오고 특수한 기능인 새 페이지와 수직탭은 되지 않았다.

 

 

 

 

 

 

 

5.십진수를 아스키코드로 출력

/************************************************************************************************
          ASCII표를 보고 영문 한 글자씩 조합하여 "Hello World!!" 출력 (20110330_Hello)
************************************************************************************************/

#include <stdio.h>

int main()
{
    printf("%c%c%c%c%c%c%c%c%c%c%c%c%c\n",72,101,108,108,111,32,87,111,114,108,100,33,33);
   
    return 0;
}

 

 

 

 

 

6.교과서 예제2-11 + 각 자리를 정수값으로 출력

/***************************************************************************************************************

각 자료형별 문자배열의 크기를 구하고 문자를 입력 받아 각 문자를 정수값으로 출력 (20110330_ex2-11)

***************************************************************************************************************/

#include <stdio.h>


int main()
{
    char word[30];    /*문자배열 선언*/
    short sNum[30];
    int iNum[30];
    int i;

/********************************************************************************
                            char,short,int형 배열의 크기를 구함
*********************************************************************************/


    printf("배열의 크기는, \n");
    printf("char 30개\t = \t%d Bytes\n",sizeof(word));
    printf("short 30개\t = \t%d Bytes\n",sizeof(sNum));
    printf("int 30개\t = \t%d Bytes\n",sizeof(iNum));
    printf("\n");


/*******************************************************************************
                            문자열을 입력받아 각 자리별 정수로 출력
*******************************************************************************/

    printf("Please enter anyting: ");
    scanf("%s:",word);
    printf(/*"당신이 친 글은 %s입니다.\n",*/ word);
    printf("\n");

    for(i = 0;word[i] != '\0';i++)
    {
        if(i%5 == 0) printf("\n");

        printf("%c - %d\n",word[i] ,word[i]);
    }
   

    return 0;
}


아래와 같은 경고메세지가 뜬다. VS6.0에선 경고가 출력이 되지 않았으나 VS2010에선 경고가 세 개나!!

 

 

이 함수 또는 변수가 안전하지 않을 수도 있다? scanf_s()함수 어쩌구 저쩌구…

검색 후 결론은 비번입력 할 때 암호를 입력할 때 쓰는 함수를 쓰면 다른 사람이 볼 수 없어 보안성이 높다.

필요 없으니 scanf()함수 그대로 써도 된다.

 

참조되지 않은 지역 변수라는 뜻은 선언은 해놓고 왜 사용하지 않아? 라고 컴파일러가 의아해 하는 메세지로...

살포시 무시합니다.

 

 

★문자열과 문자의 차이와 구분법

int A;        ->  A는 변수명이다.

‘A’            ->  A는 문자로 65라는 값을 가지고 변하지 않는 성질은 상수와 같다. 1Byte차지.

“A”           -> A는 문자열로 ‘A’라는 문자와 ‘\0’(null문자) 2Byte를 차지 한다.

                   끝에 ‘\0’ (null)은 컴파일러가 알아서 넣어준다. 프로그래머가 직접 넣어도 된다.

                   그렇게 해야 될 때가 있지롱.

 

‘ABC’        -> 이렇게 문자열을 작은 따옴표로 감싸면 아래의 그림과 같은 오류가 난다.

 

 

※문자배열은 끝에 null이 없음. 예제2-11에서 word배열은 끝에 null이 없다는 것인가?

  그럼 범위를 벗어 날 수도 있겠군. (다행히 scanf()가 null을 붙여 준다!)

 

 

자세히 살펴보니 printf()도 문자열을 출력하는 함수이다. (큰 따옴표가 문자열 구분이니)

 

 

 

 

‘&’를 달지 않고 배열명을 적은 이유는 후에 포인터를 배울 때 알게 될 것이니 지금은 외울 것.

 

 

추가로…

printf(“당신이 친 글은 %s입니다.\n”, word); 명령문에 대해…

“프로그램은 이렇게 짜는 것이다.” – CM

이 말씀을 하신 시간에 프로그램을 뜯어 고쳐도 보라고 하신 것 같은데 노트에는 기록되어 있지 않다.

선생님의 말씀을 잘 듣고 있는 것 같은데 알고 보니 나사가 몇 개 빠진 느낌이다.

어디서 수리해야 되나? 흑흑

 

같은 시간대에 말씀하신 웹프로그래밍에 관한 이야기도 적으며 연관 지어 보자. (중요한가?)

포털사이트 같은 계정을 발급 받아 회원제를 실시하는 홈페이지를 보면 로그인하면,

“안녕하세요. OOO님. ~~~”라는 메세지와 같이 사용자에 따라 달라지는 메세지를 보여 주려면..

HTML로는 불가능하다.

그러니, ASP: MS사 Active Server Page

          JSP: JAVA

          PHP: 리눅스                           같은 웹프로그래밍 언어로 짠 뒤…

서버에서 유저의 요청이 들어 오면 HTML로 변환해서 사용자에서 보여준다.

 

여기서 상기의 내용들과 말씀을 생각해보면 프로그램이란 것이 인간의 편의를 위해서 기계가 대신 정해진 규칙대로 일(계산)을 하는 것인데 printf()에서 %s의 위치만을 알려준 것은 아니라고 본다.

오늘 결석한 재원씨가 HTML책을 항상 들고 다니는 것이 이상하게 이 때 떠올랐다. 이에 웹프로그래밍 언어라는 것도 있으니 관심이 있으면 해보라는 것도 아닐 것이다. (여러 가지 정보를 분석한 결론)

 

내 생각엔 학생들이 소스코드를 뜯어 고치려는 의지가 거의 없어 보이니 이렇게도 해보고 저렇게도 해봐서 언어에 익숙해 지라는 말씀인 듯 하다.

 

 

“바보야”   ->  scanf()      ->   word[]    ->   printf()  ->   “당신은… 바보야”

나는 바보다.

학교에서 배운 것 그 이상을 하기가 힘들다.

지식만 부족한 게 아니라 대인관계가 엉망이다.

가벼운 말을 많이 하여 결국 자멸을 하게 되는 경험을 많이 하였으나 아직까지 고쳐지지 않고 있다.

이런 습관이 프로그래밍에서도 나타난다.

고쳐야 취업하고 장가도 가겠지? ㅠㅠ  

 

 

마지막으로 printf(word);  이렇게 하여도 문자열을 인수로 받으니 시작주소만 전달해 줘도 된다.

(노트에 제대로 필기를 하지 않아 재해석한 것.)

 

 

 

7.재미있는 마인드스톰…검은색 라인을 따라가기

 

 

상기의 그림과 같이 센서를 좌측에 달면 좋고, 속도를 늦춰서 일단 전진만 하여 선을 따라가게 하라.

 

 

/***********************************************************************

 

제목: 마인드스톰NXT spike 라인따라가기
작성자: 김수만
작성일자: 2011년 3월 30일
내용: 라인 따라가기
     
*************************************************************************/


#define THRESHOLD 50
#define LIGHT     Sensor(IN_3)
#define DELAY     1000


task main()
{
     unsigned int count=0;

     SetSensorLight(IN_3);
    
     while(1)
     {
             NumOut(60,LCD_LINE1,LIGHT);    //빛센서의 값을 출력
    
             if(LIGHT > THRESHOLD)        //흰색바탕에 있다면
             {
                      OnFwd(OUT_B,100);       
                      OnFwd(OUT_C,45);        //우회전

                      count++;            //1ms에 1씩 업카운트
                      Wait(1);
              //1.5초 동안 흰색 바탕이면 벗어난 것으로 간주                    
                      if(count > 1500)       
                      {
                             OnFwd(OUT_B,25);
                             OnFwd(OUT_C,100);    //급하게 좌회전
                             Wait(3700);    //3.7초 동안
                            
                             count = 0;        //카운터 리셋
                      }

             }
         else                //검은선에 있다면
             {
                      count = 0;        //카운터 리셋
                      OnFwd(OUT_B,50);
                      OnFwd(OUT_C,100);        //좌회전

             }
     }
}

 

 

29일에 짠 소스로 첫 시험을 하였더니 원하는 결과가 나오지 않아 조금 수정하여 여러 번 실험을 하였으나 결국 문제를 해결하지 못 하였다.

 

전갈로봇이 직진을 못 하여 왼쪽 모터의 파워를 최대한 올려 보았으나 헛 돌기만 하고 보다 약한 오른쪽 모터의 출력이 지면에 더 많이 전달되었는지 좌회전을 하였다.

어쩌다 로봇의 균형이 어긋났는지 아무리 봐도 알 수 없어 결국 다리를 떼어 내고 바퀴를 달아 모터의 출력균형은 맞췄다. 그러나 START지점을 통과하지 못 했다. 검은 선을 벗어나면 센서입력을 무시하고 반대방향으로 일정시간 이동한다는 조건문은 어떤 상황에선 완벽하지 못 하다는 결론이다.

다른 사람이 짠 소스와 동영상을 분석해 보는 것도 좋을 듯 하다.

 

 

동영상1. 왼쪽 다리의 문제로 좌회전만 하는 불쌍한 우리조의 전갈로봇



동영상2~4. 다른 조의 라인트레이서...팀원이 협력해서 하는 모습이 좋았다.