3.15(목) float형에 대해서

from Study/C언어 2007/03/15 10:27 view 25920

  scanf("%f", &f);
  printf("%f\n", f);

float형 변수 f에 임의의 수를 입력했을 때 컴파일러가 문제인지 몰라도 12.2를 입력하면

12.200000 이 출력 되는데

  printf("%d\n", i=(int)(f * 100));
  printf("i = %d\n", i%100);

이런 코드를 통해 소수점 이하 두자리를 구하려고 하니깐 19가 나온다..-_-;;

초난강 모드로 빠져 든다.

float형 변수는 다루기 힘든 건가..

3.14(수) Shift연산자

from Study/C언어 2007/03/14 23:32 view 24108
매번 느끼지만 이놈의 쉬프트 연산자는 감이 도통 잡히지 않는다. 왜냐.. 평소에 연산작업을

할 때 10진법을 주로 사용하므로 비트연산을 하는 이놈의 연산자는 친숙하지 않기 때문이다.

그래픽 쪽 프로그래밍 할때는 필수적(마스크나 반전,복원등)이라고 하나 해본적이 있어야지..

하지만 CPU입장에서 a*2를 한번 할 시간에 a<<1를 10번정도 할수 있다는 것은 큰 매리트가

아닐까 싶다.
 
 쉬프트 연산이 곱셈에 비해 불리한 점은 2의 거듭승에 대해서만 곱셈이 가능하다는 점이다.

2배,4배,8배,16배 등만 할 수 있으니 얼마나 불편한 일인가...

3배 : a << 1 + a;
9배 : a << 3 + a;
15배: a << 4 - a;
60배: a << 6 - a << 2;  //64배에서 4배를 제한 60배...와

속도가 중요하다면 이런 코드들도 욕심 부려 볼만 하지 않을까..

3.14(수) 이동효과 나타내기

from Study/C언어 2007/03/14 17:01 view 24407
for(i = 1; i <= 80; i++)
{
 gotoxy(i, 10);
 putch('#');
 gotoxy(i-1, 10);
 putch(' ');
 delay(100);
}


'#'을 왔다리 갔다리 하는 효과를 보여줄 때 출력,지움,시간끌기를 통하여 애니메이션 효과를

보여 줄 수 있다. 새위치에 그리고 이전 위치 지운 다음에 시간을 조금 끌어서 움직이고 있다

는 효과를 낼 수 있다.

3.14(수) 스캔코드와 아스키코드

from Study/C언어 2007/03/14 16:52 view 25665

 벌써부터 어깨가 뻐근한게 죽을 맛이다. 몸이 찌뿌둥 하다고 해야하나.. 앉아 있으면 시간이

물 흐르듯이 지나가서 하루가 이리 빨리 가나 싶다.

ch=getch();
  if (ch == 0xE0 || ch == 0) {
   ch=getch();
}
 getch()함수로 키보드로 입력되는 값을 ch 변수에 저장하고자 할때 아스키코드값 이외의

값을 받게 되면 0xE0(224)나 0 값을 리턴하게 되는데 이때 다시한번 getch()함수로 표준입력

을 변수에 대입시키게 되면 스캔코드를 얻을 수 있게 된다.

 콘솔창내에서 커서를 이동시키고자 할 때 방향키를 누르면 그때 발생되는 스캔코드를 읽어

드려서 커서의 위치를 변경할때 쓰인다.

 

getch 와 _getch

from Study/C언어 2007/03/14 09:12 view 27565

ANSI C에서 정의한 함수가 getch이고 VC++ 컴파일러 에서 지원하는 함수가 _getch이다.

굳이 표준 외에 함수를 만든 이유가 무엇일까 생각해봤는데

#include <conio.h>
#include <stdio.h>

void main( void )
{

   /* Display message until key is pressed. */
   while( !_kbhit() )
      _cputs( "Hit me!! " );

   /* Use _getch to throw key away. */
   printf( "\nKey struck was '%c'\n", _getch() );
   _getch();
}

만약에 이 소스에 getch라는 변수를 추가 했을때 getch()함수를 사용했다면

error C2064: term does not evaluate to a function

와 같은 에러를 볼 수 있다. 이를 방지 하기 위해서 '_'를 붙인 함수를 만든건 아닐까라는

생각이 든다. 그래서 변수명앞에 '_'를 사용하는 것을 금하는 거 아닐까-_-..

터보C(TurboC.h )

from Study/C언어 2007/03/13 18:52 view 25580

출처:http://winapi.com 

커서의 움직임을 보다 효율적으로 하기 위해 TurboC.h을 제작한 것 같다.

이를 사용하면 cmd창내에서의 커서를 간편하게 제어할수 있다.

웬만한 해더파일을 전부 포함시켜 놓았다.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>

커서의 사이즈와 타입을 위해 선언해 놓았다.
typedef enum { NOCURSOR, SOLIDCURSOR, NORMALCURSOR } CURSOR_TYPE;
void setcursortype(CURSOR_TYPE c);

화면을 command명령어인 cls를 이용하여 초기화 해준다.
void clrscr();

커서의 좌표를 매개변수로 입력하여 원하는곳에 goto해준다.
void gotoxy(int x, int y);

커서의 현재좌표를 구하는 함수이다.
int wherex();
int wherey();

#define delay(n) Sleep(n)       // n/1000초만큼 시간 지연

rand함수만을 호출 할경우 매번 똑같은 난수가 발생 하므로 time함수와 srand함수를 이용하여  난수의 초기값을 매번 다르게 해준다.
#define randomize() srand((unsigned)time(NULL))  // 난수 발생기 초기화
#define random(n) (rand() % (n))     //0~n까지의 난수 발생

3.13(화) float와 __int64

from Study/C언어 2007/03/13 18:21 view 22046
VC++6.0 컴파일러가 지원하는 자료형중에 __int64라는 게 있다. 뭔지 한번 살펴봤더니.

The types __int8, __int16, and __int32 are synonyms for the ANSI types that have the same size, and are useful for writing portable code that behaves identically across multiple platforms. Note that the __int8 data type is synonymous with type char, __int16 is synonymous with type short, and __int32 is synonymous with type int. The __int64 type has no ANSI equivalent.

표준규격은 아니란다. 그럼 왜 만들어놨을까..

int형으로 표현할수 있는  정수는 42억정도까지 있다. 근데 이보다 더 큰 수를 쓰고 싶다면

어쩔수 없이 float형을 사용하여 표현 할 수 있는데 이는 처리속도에 지장을 준다.

CPU는 쓸모 없는 소숫점이하의 수를 연산하게 되는 것이다. 이를 위해 __int64라는 자료형이

생겼다고 하는데 효율성이 얼마나 좋을지는... 이런거 테스트해보는 구문이 있었는데

나중에 생각나면 한번 해봐야 하지 않을까..

예전에 두수를 연산할때 되도록 '/'연산자를 쓰면 몇번의 연산을 더 필요로 하기 때문에

다른 방법으로 하느것이 프로그램의 동작속도를 빠르게 한다고 했었는데 그거와 비슷한 것
 
같다. Shift연산자를 사용하면 된다. >> , << 곱하기 나눗셈 대신에 요고 이용.

3.13(화) bit와 메모리에 관해서..

from Study/C언어 2007/03/13 17:42 view 18459

 키워드와 식별자에 대한 강의는 대충 끝났다. 기존에 알고 있는 것들 이었지만 기초는

언제나 중요한 법이니깐 그리고 내 기억력이 3일(?)이라 왠지 새롭다.

2^10은 1024 즉 1KB라는건 왠지 중요한 척도 이다. 이 숫자만 알고 있다면 32비트던 16비트던
대충 감이 온다는 것이다. 16비트는 2^16이므로 2^10*2^6으로도 표현 가능하고 즉 64KB라는

답이 바로 나오는 것이다. 이 64KB는 메모리를 참조할때 한번에 처리(?)하는 범위가 된것이

다. 아.. 그리고 16비트는 2바이트이므로 int형이나 포인트형 변수는 2바이트를 가지게 된다.

32비트도 마찬가지로 2^32이므로 2^30*2^2, 즉 한번의 클럭에 4GB라는 어마어마한 처리속도

 

가지게 되었다. 하지만 이는 이론적 수치이고 RAM과 CPU간의 전송속도를 맞추기위해

1~2MB
정도의 처리를 한다고 한다.


32비트에서는 포인터형과 int형이 4바이트를 가지게 되고 64비트에서는 int형은 호환성의
 
문제때문에 그대로 유지하고 포인트형은 64비트의 모든 주소값을 표현하기 위해

(그럴리는 없지만-_-..1800경??) 8바이트로 바뀔것이라 한다. 이미 바꿧나??

근데 빠른처리속도와 효율적인 메모리공간관리는 비례할 수 없나..


잘 몰라도 지금의 넉넉한 하드웨어적 환경이라면 메모리공간보다도 처리속도를 더 신경쓰느

게 좋은선택일 것 같다.

 계단식(처리비율??)으로 설계하여 CPU가 한번에 하나의 일을 처리하도록 설계하는 것이

하나의 방법이라는데 아직은 그 의미만 알 뿐이지 구현까지는 떠오르지는 않는다.

더 배우고 하다보면 "아하" 라는 느낌을 받기를 바라며..

3.13(화) scanf 를 보면서..

from Study/C언어 2007/03/13 14:30 view 19842
 듀얼 모니터를 쓰기 위해 LCD모니터 하나를 학원에 가져 왔다. 아침 7시에 와서 그런지
지하철에서도 편히 왔고 거리도 한적한 모습이었다.

 scanf 를 쓸때 %d를 입력받고 %c를 쓰게 되면 버퍼에 남아있던 줄바꿈(?)이 남아 있기 때문에 문제가 되곤 하는데 여러 해결방법이 있는데 무엇이 좋은지는 아직 모르겠다.

1. scanf("%d",..);   scanf(" %c",..);      //서식 문자사이를 한칸띠어서 하는 방법.
2. scanf("%d",..);   scanf("\n%c",..);  //서식 문자앞에 \n를 써서 해결.
3. scanf("%d%*c",..); scanf("%c", ..); //%*c를 써주는 방법.
4. fflush(stdin); //입력버퍼를 비워주고 다시 입력 받는 방법.

3.12(월) 첫걸음

from Study/C언어 2007/03/12 17:50 view 22454

 2주 늦춰진 개강날이지만 제대로 준비도 못하고.. 무거운 발걸음으로 지하철을 탔다.

비록 신림역에서 강남역까지 30분거리지만 지옥철이라고 듣던 서울의 출근길 지하철을 처절

하게 몸으로 느껴 주시고 무난히 학원에 찾아갔지만 학원 첫인상은 화장실에서 밤새듯한

모습을 하신 분께서 양치질 하는 모습과 누군가가 먹다 만 맥주피트병(약?)이 강의실에 있는 것이

꾸밈이 없다고 해야 할까..

"유저에게 뒤쳐지면 좋은 프로그래머가 될 수 없다."
"잘하는 사람은 더 열심히 하는데 잠을 줄이고 모든 시간을 프로그래밍에 투자해라."

첫날이라 그런지 장달상강사님이 무언가 공부하고자 하는 계기를 심어주고자 하시는 듯
 
했다. 나도 서울까지 올라와 무언가는 배우고 가자는 마음도 있고 잘하는 사람과의 격차도

줄여보자는 마음은 산더미인데 강사님 말대로 작심삼일을 수백번 반복해봐야 할려나..

그나저나 옆에 건물 공사소리가 신경쓰이네.


Tag |