'Study - Programming/C/C++'에 해당되는 글 24건

  1. 2007.08.29 [API] 마우스 예제
  2. 2007.08.29 비트 시프트로 곱셈, 나눗셈 구현하기 1
  3. 2007.08.29 [C++] 논리형 bool
  4. 2007.08.29 가변 인수 이야기
Study - Programming/C/C++2007. 8. 29. 01:19

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 HDC hdc;
 PAINTSTRUCT ps;
 static BOOL isDown = FALSE;

 static int oldx;
 static int oldy;

 switch (iMessage)
 {
 case WM_LBUTTONDOWN:
  oldx = LOWORD(lParam);
  oldy = HIWORD(lParam);
  isDown = TRUE;
  return 0;
 case WM_LBUTTONUP:
  isDown = FALSE;
  return 0;
 case WM_MOUSEMOVE:
  if(isDown == TRUE)
  {
   hdc = GetDC(hWnd);
   MoveTo!Ex(hdc,oldx,oldy,NULL);
   oldx = LOWORD(lParam);
   oldy = HIWORD(lParam);
   LineTo(hdc,oldx,oldy);
   ReleaseDC(hWnd,hdc);
  }
  return 0;
 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  EndPaint(hWnd,&ps);
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}


별것 없다. 마우스로 드로잉 하는 예제


우선 WM_LBUTTONDOWN 메세지가 호출되면 oldx,oldy에 좌표가 저장되고, WM_MOUSEMOVE메세지에서 마우스가 움직일때마다 좌표를 읽는다. 그래서 oldx,oldy에서 마우스 위치까지 선을 그려내면 된다.


Posted by 머리
Study - Programming/C/C++2007. 8. 29. 01:17

int pow(int num1, int num2)//대충 보고 알수 있음
{
     int i;
     int result = 1;

     for(i = 0 ; i < num2 ; i++)
     {
          result *= num1;
     }

     return result;
}

//원리 : 2 * 9 = 2 * (2 ^ 3 + 2 ^ 0) = 2 * (2^3) + 2*(2^0)
//곱할 수(9)를 2로 인수분해 함

int mul(int num1, int num2)
{
     int i = 0;//루프 변수
     int result = 0;//결과

     while(num2 != 0)
     {
           //2로 인수 분해 - (1)2의 몇승을 해야num2의 초과직전인지 체크
          while(pow(2,i) < num2)
               ++;

          result += (num1 << i);//그 수만큼 num1의 시프트값을 결과값에 더한다

          num2 -= (int)pow(2,i);//그리고 2의 i승을 num2에서 뺀다
          i = 0;//루프 초기화
     }//num2가 모두 분해되어 0이 될때까지 루프

     return result;//결과값 리턴
}

int div(int num1, int num2)
{
     int i = 0;//루프 변수
     int result = 0;//결과

     while(num2 != 0)
     {
     //2로 인수 분해 - (1)2의 몇승을 해야num2의 초과직전인지 체크
     while(pow(2,i) < num2)
          i++;

     result += (num1 >> i);//그 수만큼 num1의 시프트값을 결과값에 더한다

     num2 -= (int)pow(2,i);//그리고 2의 i승을 num2에서 뺀다
     i = 0;//루프 초기화
     }//num2가 모두 분해되어 0이 될때까지 루프

     return result;//결과값 리턴
}

Posted by 머리
Study - Programming/C/C++2007. 8. 29. 01:15

  우선 C에서 거짓은 0으로, 0이 아닌 값은 모두 참으로 인식한다. 0은 거짓이 확실하지만 참은 굳이 1이 아니어도 된다는 말. 1을 하는 이유는 그냥 보편적이기 때문이다. 단, 다른 언어에서는 종종 보이는 true와 false라는 것을 표현해주는 데이터형이 C에는 없다.


  bool형은 이런 것을 보완하기 위해 C++에서 새로 나온 것이다.


bool ex = true; //ex에는 true가 대입

ex = !ex ; //ex에는 false(!true)가 대입

ex = (ex == false); //ex에는 true가 대입


  물론 이런식으로도 가능하다.


bool ex = -123; // true 대입

bool ex = 0; //false 대입


  다시 한번 체크하자. 참은 굳이 1일 필요가 없다. -123처럼 음수라도 0만 아니면 참이 된다.

 

  하지만 bool을 출력한다고 하면 이야기는 달라진다. 다음 소스를 보자

bool ex = true;

cout << ex << ',';

ex = false;

cout << ex;

 

출력 : 1,0

  즉 출력을 하면 false는 0, true는 1로 출력이 된다. 하지만 좀더 명확하게 true 또는 false로 표현해줄 필요가 있다. 그럴떄는 이렇게 하면 된다.

 

cout << boolalpha;

cout << true << endl;

cout << false << endl;

 

cout << boolalpha로 해주면 true 또는 false로 출력을 해준다.

 

참고로 C99에서는 bool형을 지원한다.

Posted by 머리
Study - Programming/C/C++2007. 8. 29. 01:13

혹시 이런 생각 해본적 있는가? 보통 함수의 인자의 개수는 정해져 있는데, printf함수 같은 경우는 그 수가 제한이 없지 않은가?


예전에 이런 것과 관련해서 함수 하나를 구현할 일이 있었는데 미루다 미루다 이제야(한 일주일 된듯 -_-;;) 한번 찾아 보았다.


먼저 printf 함수 원형을 한번 보자

int printf(const char*,...);

이렇게 되어 있다. 사실.. 이거는 컴파일러가 'printf(' 여기까지만 치면 원형을 보여주는데 쓸데없이 stdio.h를 열어보는 뻘짓까지 했다 ㅋ


한번 분석해 보자.


  우선 printf의 리턴 데이터 형식은 int형이였다. 이 함수의 리턴값은 출련한 변수의 갯수이다. 예를 들어 ("%d,"%d",a,b)했으면 리턴 값은 2.


 그리고 첫 번째 인자는 우리가 "name %s\b"하는 이런 거고.. 중요한 것은 두 번째 인자 '...'이다. 인자를 생략한다는 표시인데, 이 표시를 통해서 함수 호출 시 인자를 얼마든지 넣을 수 있게 된다. 그것을 처리하는 것은 원형에서 해줄 몫이고.. 그리고 이것을 '가변 인수'라고 한다. 뭐 자세한 사용법은 알아서 공부해볼것, 이건 대충 사용법만 보고 거기에서 합계 구하는 예제 있길래 안보고 만들어 본 것. 이해 자체는 그리 어렵지 않은데.. 음 좀더 공부해 봐야지.



#include
#include

int GetSum(int Num,...)
{
 va_list ap;
 va_start(ap,Num);
 int arg;
 int i;
 int Sum = 0;

 for(i = 0 ; i < Num ; i++)
 {
  arg = va_arg(ap,int);
  Sum+= arg;
 }

 va_end(ap);
 return Sum;
}

void main()
{
 printf("%d\n",GetSum(10,1,2,3,4,5,6,7,8,9,10));
}



참, 참고로 C#에서는 가변 인수를 사용하는 방법이 따로 지원한다. 이것보다 더 쉽게.. (맞나?) 그때는 이게 말 뜻 자체도 이해가 안되다가 아! printf! 해서 이해만 하고 그래서 뭘 만들어볼까할때 아이디어가 생각이 안나 넘어갔는데.. 이렇게 다시 해볼 기회가 생겨서 다행이다.  뭐 이거 찾다가 VB에서도 가변인수 쓸수 있다는거 알았고, VB,C# 둘다 연습해 봐야겠다 함.. 그리고 C/C++에서도 계속 공부하고..

Posted by 머리