한글 문자열을 뒤집어라.

from Study/Quiz 2007/12/01 18:28 view 29012

한글도 되도록 하자.

// 200447214 김준주
#include <iostream>
using namespace std;

char* ReverseString(const char* src, int len)
{
 // 새로운 문자열을 보관할 메모리를 할당한다.
 char* reverse = new char[len + 1];

 // 문자열을 역순으로 복사한다.
 for(int i = 0; i < len; ++i)
 {
  if( src[len-i-1] < 0 && src[len-i-2] < 0)
  {
   reverse[i] = src[len - i - 2];
   reverse[i+1] = src[len - i - 1];

   ++i;
  }
  else
   reverse[i] = src[len - i - 1];
 }

 // 새 문자열의 끝에 NULL을 넣어준다.
 reverse[len] = NULL;

 // 새 문자열을 반환한다.
 return reverse;
}

int main()
{
 // 문자열을 하나 만든다.
 char original[] = "한글 뒤집기";

 // 함수를 호출한다.
 char* copy = ReverseString( original, strlen(original) );

 // 두문자열을 출력한다.
 cout << original << "\n";
 cout << copy << "\n";

 // 새 문자열의 메모리를 해제한다.
 delete[] copy;
 copy = NULL;

 return 0;
}

Tag | ,

GetPrivateProfileString Function (ini 읽기)

from Study/API 2007/10/05 21:04 view 36590
아나 감동의 쓰나미.. .ini 에서 등록한 키워드 읽어오기 굳이 ini아니라도 되지만..-_-..
참고 : http://msdn2.microsoft.com/en-us/library/ms724353.aspx 

// ini 파일
[section]
key = string

ex)
[C/C++]
KEYWORD = const,for,if


1. MFC에서 CMapStringToString 클래스를 사용하여 읽어오기

more..



2. CIniFile 클래스를 사용해서 읽어오기 ( 래핑 클래스 )

more..

Tag | , ,

4.2(월) min, max의 활용

from Study/C언어 2007/04/02 16:30 view 27773
#define max(a, b)  (((a) > (b)) ? (a) : (b))
frame = max(frame-10, 10);

frame은 10미만값을 가질 수 없다.

#define min(a, b)  (((a) < (b)) ? (a) : (b))
frame = min(frame+10, 1000)

frame은 1000을 초과 할 수 없다.

if문으로 할수도 있겠지만 이렇게 범위를 지정 해 놓으니 훨씬 좋아 보인다..
Tag |

3.28(수) strstr, strtok 함수

from Study/C언어 2007/03/28 18:38 view 38629

함수 개요

#include <string.h>

char *strtok( char *str, const char *set);

char *strstr( const char *src, const char *sub);


참고 : 2007/11/29 - [Study/C언어] - 문자열 함수의 구현

strstr 함수는 표준 C에서 처음 도입한 함수다. 이는 문자열 str 안에서 문자열 sub가 처음으로 나오는 위치를 찾아 해당 위치를 가리키는 포인터를 반환한다. 문자열 sub가 문자열 src에 한 번도 나오지 않는 경우에는 널 포인터를 반환한다.

strtok 함수는 문자열 str을 문자열 set에 나온 문자로 구분되는 토큰으로 나눌 때 사용한다. 각각의 토큰을 분리하기 위해 strtok 함수를 여러 번 호출하며, 도중에 문자열 set의 내용을 바꿀 수 있다. strtok 함수를 처음 호출할 때는 str에 문자열을 제공하며, 그 뒤에 이어지는 호출에서는 첫 번째 인자로 널 포인터를 주게 된다. 그러면 strtok함수는 이전에 찾은 토큰의 뒷부분부터 이어 검색을 진행한다.(strtok 함수를 사용해서 문자열 안의 토큰을 검색하는 과정에서 처음 제공된 문자열 str을 도중에 수정하면 안 된다.)

과정을 더 자세히 설명하면, 매개 변수 str에 널 포인터가 제공되지 않으면, strtok 함수는 문자열 str에서 set 에 존재하는 모든 문자를 건너뛰게 된다. 만약 문자열 str이 문자열 set의 문자로만 구성되어 있는 경우, strtok 함수는 토큰을 찾을 수 없기에 결과로 널 포인터를 반환한다. 이때 내부적으로 상태를 저장하기 위해 사용하는 포인터는 널 포인터로 설정된다. 문자열 str에 문자열 set에 나오지 않는 문자가 있는 경우, 내부 상태 포인터가 str에서 해당 문자를 가리키게 되고, str로 널 포인터가 제공된 것처럼 함수 실행이 계속된다.

str과 내부 상태 포인터 모두가 널 포인터인 경우, strtok 함수는 널 포인터를 반환하고 내부 상태 포인터는 널 포인터로 남는다.(이는 모든 토큰을 찾은 이후에 추가로 strtok 함수가 호출되는 경우를 위해서다.) str 이 널 포인터고 내부 상태 포인터가 널 포인터가 아닌 경우, 함수는 내부 상태 포인터가 가리키는 위치부터 시작해서 처음 제공된 str의 나머지 부분에서 set에 포함된 문자를 찾게 되고, 그와 같은 문자를 찾으면 해당 문자를 널 문자로 덮어쓴다. 함수의 결과로는 내부 상태 포인터의 값을 반환하고, 반환 이후에 내부 상태 포인터의 값은 저장된 널 문자 바로 뒤의 문자를 가리키도록 수정된다. 그러한 문자를 찾지 못하는 경우, strtok 함수는 내부 상태 포인터의 값을 반환하고 내부 상태 포인터를 널 포인터로 설정한다.

/*
다음프로그램은표준입력스트림으로부터문자열을입력받아strtok 함수를통해입력받은
라인을단어단위로나누어표준스트림으로출력한다. 이때단어는공백, 쉼표, 마침표, 인용부호,
물음표로구분된다고가정한다.
*/


예제 1.

#include <stdio.h>
#include <string.h>

int main() { char  hp[] = "080)(010)1234-4567";
    char  *p;
                  
    p = strtok( hp, "-()" );

    while( p )
    {
        printf("%s\t", p);
        p = strtok( 0, "-()");
    }

    printf("\n");

    return 0;
}

예제 2.


#include <stdio.h>
#include <string.h>

#define LINELENGTH 80
#define SEPCHARS " .,?\"\n"

int main(void)
{
   
char line[LINELENGTH];
   
char *word;

   
while(1)
    {
        printf(
"\nNext line? (empty line to quit)\n");
        fgets(line, LINELENGTH, stdin);
       
if(strlen(line) <= 1)
           
break;              //프로그램종료
        printf("That line contains these words: \n");
        word = strtok(line, SEPCHARS);              
//첫번째단어를찾음
        while(word != NULL)
        {
            printf(
"\"%s\"\n", word);
            word = strtok(
NULL, SEPCHARS);   //다음단어를찾음
        }
    }
}

Tag |

3.23(금) clock() 함수 응용 사례.

from Study/C언어 2007/03/23 16:12 view 24503

#include <Turboc.h>

//typedef long clock_t;
//#define CLOCKS_PER_SEC 1000

void
main()
{
    clock_t t1,t2;
    int count=0;

    t1=clock();

    for (;;) {

        printf("기다리십시오. %d\n",count++);

        t2=clock();

        if (t2-t1 > 3*CLOCKS_PER_SEC) {

            break;
        }
    }

    printf("끝났습니다.\n");
}

3초간 어떤 작업을 반복적으로 수행 하고 싶을 때 쓸 수 있는 코드 이다.

시작시간과 현재 진행된 시간차가 3*1000,즉 3초일 때 루프벗어 난다. Delay는 기다리는 동안

다른 일을 할 수 없지만 일정 시간동안 어떤 작업을 하고 싶다면 clock 함수로 구한 시간을 이용하여

두 시간값의 차(t2 – t1)을 구해준다.

Tag |

#include <TurboC.h>
#include <math.h>

void
main()
{
    int i;
    time_t t1,t2;

    time(&t1);
    for( i = 0; i < 100000 ; i++)
        printf("결과= %f\n", sin(i*3.1416/180)*(i*3.1416/180));
    time(&t2);
    printf("%.2f초가걸렸습니다.", difftime(t2,t1));
 
}

Time함수와 difftime함수를 통해서 돌려봤더니 속도 차이가 엄청나다.. 이게 바로 CPU의 성능 차이인가..

서브컴(노트북) IBM X20 CPU – 600, RAM – 384M 대략 87초 OTL  

메인컴(데스크탑) 듀얼코어 CPU - E6600, RAM – 2G 환상(?)적인 5초 ^^\

사용자 삽입 이미지사용자 삽입 이미지 CEXAM.exe

속도측정 실행파일

Tag |

3.20(화) 함수의 설계 원칙 정리

from Study/C언어 2007/03/20 18:30 view 25486
함수를 작성하는 문법과 호출하는 방법, 인수를 받아들이고 리턴하는 방법을 익히는 것은 그다지 어렵지 않지만

정말로 함수답게 잘 나누고 디자인하는 것은 무척 어렵고 단기간에 체득되지 않는다. 함수는 프로그램을 구성하는

단위로서 잘 나누어 놓으면 프로그램의 구조가 탄탄해지고 확장하기도 쉽고 재사용성도 좋아진다.

함수디자인은 오로지 많은 분석과 실습만으로 얻어지는 경험이다. 꾸준한 연습만이 해결책이라 할수있다.


함수를 잘 만드는 기본적인 지침

1. 함수의 이름을 최대한 설명적으로 작성하여 이름만으로 무엇을 하는 함수 인지, 이왕이면 어떻게 쓰는 것인지도

알 수 있도록 한다. Score, Draw, Test 라는 이름보다도 GetScore, DrawScreen, TestGameEnd와 같이 기능을

명시해주는게 보기도 좋고 효율적이다. 자바를 이용하여 코딩해 보면 GET,SET 을 주로 함수앞에 써서 값을

얻거나 정해줄때를 명확히 표현해준다.


2. 두번이상 중복된 코드는 반드시 함수로 분리한다. 3번도 아니고 2번인 이유는 해당 동작을 수정해야 할때를

생각해 보면 된다. 만일 2번의 중복된 코드가 있는데 이 코드가 논리적으로 맞지 않다면 수정을 해줘야 할 것이다.

그러나 일일이 찾아가서 두개를 모두 고친다는 보장은 없다.(나같은 놈은...특히) 실수로 한 곳을 고치지 않으면

이것이 바로 버그의 원흉이 된다. 또한 두번 중복되는데 3번은 안되고 그이상은 안되겠는가 .. 미래를 위해서라도..


3. 반복되지 않더라도 한 단위로 볼 수 있는 작업은 함수로 만든다. 설사 이 함수를 딱 한번만 호출하고 다른

곳에서 호출할 확률이 희박하더라도 이렇게 하는 것이 좋다. 코딩을 하다보면 출력을 해야 하는 부분이 있고

입력을 해야 하는 부분이 있을 것이다. main 함수내에서 이를 전부 처리해도 문제는 없다.

하지만 어디가 출력부인지 입력부인지 가독성이게 표시를 할 수 있나가 문제이다. 물론 주석으로 일일히

표시해 줘도 되지만 가독성이 떨어 진다. 함수로 객체와 비스무리하게 나눠 주면 재사용도 좋고 보수하기도 좋고..


4. 함수는 한번에 하나의 작업만 해야 한다. 함수는 프로그램을 구성하는 부품이며 부품이란 전체를 구성하는

원자적인 단위이다. 함수 하나가 출력도 하고 입력도 받는다면 굳이 함수를 쓸 필요가 있을까 고장이 나도

구조가 간단한 부품에서 나야 하지 않을까 .. 함수도 마찬가지라 생각이 든다.


5. 입력과 출력이 직관적이고 명확해야 한다. 인수는 함수에게 주어지는 작업거리인데 함수가 하는 일에

꼭 필요한 정보만 최소한의 인수로 받아들여야 한다.

void CheckStr(char *str, int len);

과 같이 함수에 인수를 넘기고자 했을 때 굳이 문자열의 길이 len을 넘겨주지 않아도 strlen이라는 함수로

문자열의 길이를 판별할 수 있다는 것이다. 불필요한 입력이 생겨버린 셈이다.


6. 함수는 자체적으로 에러 처리를 해야 한다. 파일을 처리한다든지(fopen) 초를 계산한다든지(mktime)

할 때 에러가 발생하면 이들은 -1 , null 을 반환 해준다. 이러한 반환값을 함수내에서 에러 처리를 해줘서

어떤 프로젝트로 가져 가든 별도의 수정없이 재사용 가능한 부품이 되게 해줘야 한다. 만일 에러처리를 모두

메인 함수가 담당한다면 이 또한 함수의 사용의미를 잃어 버리는게 아닐까..
Tag |

3.20(화) 스피커음 내보기.

from Study/C언어 2007/03/20 14:00 view 23196

  왠지 예전 도스게임이 모락모락 떠오르는 음이다.. 띠~~ 띠..

#define BEEP(fre, time) Beep( (DWORD)(131*pow(1.06, fre)), (400*time));

Beep 함수를 매크로로 만들어 봤는데 -_-..  어설프네..

Beep(주파수 발생 , 발생시간) 으로 구성되어있는데 DWORD형으로 해줘야 경고 안먹는다...

131*pow(1.06, x) 이부분은 음계에 근접한 음이라고 한다. 도(0),레(2),미(4),파(5)....

Tag |