출처 - http://www.mcthe.com/xe/?mid=study&document_srl=1237&listStyle=viewer&page=45 

 

비쥬얼 스튜디오(VC++)에서 clrscr(), gotoxy() 함수를 직접 사용하는것은 불가능하다.
왜냐면, vc++는 표준 Ansi C 이외의 함수를 거의 대부분 지원하지 않기 때문..
(위와 같은 콘솔IO 전용 함수들은 표준 Ansi C 에 포함되어있지 않음)

하지만, 방법이 있다^^
clrscr() 함수는 화면을 지우는 함수이고 이와 비슷한 역할을 하는 명령어를 실행하면 된다.
vc++에서는 다음과 같이 꼼수로 대체할 수 있다.
1
system("cls");

system() 함수는 운영체제(일반적으로 도스) 명령어를 실행시키는 함수로,
cls라는 도스 명령을 프로그램 내부에서 실행한다.

도스 명령어로 cls는 화면을 지우는 명령어이므로,
clrscr()을 쓴 것과 똑같은 결과를 얻을 수 있다.

이 때  slrscr() 함수를 위한 conio.h 헤더파일은 선언해줄 필요가 없다.
대신, system() 함수를 위한 stdlib.h 헤더파일을 반드시 선언해주어야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>  // 입출력
#include <conio.h> // getch()를 위해 선언한 것.
                          // 이 헤더파일은 system()하고 관계 없음 -_-;
#include <stdlib.h> // system() 함수 사용.
 
int main(void)
{
    printf("Press any key to clear screen...");
    getch(); // 키 하나를 입력받을때까지 대기.
    system("cls"); // 화면을 지움.
 
    return 0;
}

또 하나 예를 들면..
gotoxy() 함수는 커서의 위치를 이동시키는 함수이다.
이 함수를 대체하려면 비슷한 효과를 내는 SetConsoleCursorPosition() 함수를 사용해야 한다.
(윈 API 에서 기본적으로 제공하는 함수중임, 이름이 좀 길죠. -_-;)
곧바로 사용하면 안되고 아래와 같이 응용하셔서 사용하면 된다.
그대로 복사해갖고 쓰면 됨.
소스 처음 부분에 반드시 프로토타입 선언을 해주어야 함!!
1
2
3
4
5
void gotoxy(int x, int y)
{
    COORD Pos = {x - 1, y - 1};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}

gotoxy() 함수랑 100% 똑같은 역할을 하고,
물론 사용법도 gotoxy() 함수랑 동일함.

마찬가지로 위의 방법을 사용할 때 conio.h 헤더파일을 선언할 필요는 없다.
하지만 windows.h 헤더파일을 반드시 선언해주셔야 한다.

아래 소스 코드 참고..
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <windows.h> // SetConsoleCursorPosition(), GetStdHandle()
#include <stdio.h>       // 입출력
 
void gotoxy(int x, int y); // 모든 함수에서 (main()함수 포함)
                                    // 이 함수를 사용할 수 있도록 프로토타입을 선언.
int main(void)
{
    gotoxy(15, 10); // 현재 커서의 위치를 가로 15, 세로 10 으로 바꿈.
    printf("* (15, 10)"); // 출력. -_-a
    return 0;
}
 
void gotoxy(int x, int y)
{
    COORD Pos = {x - 1, y - 1};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}

Randomize Statement

 

Description

난수 발생기를 초기화합니다.

 

Syntax

Randomize [number]

수는 유효한 수식이면 됩니다.

 

Remarks

Randomize문은 수를 사용하여 Rnd 함수의 난수 발생기를 초기화하고 새 시드 값을 제공합니다.

수를 생략하면 시스템 타이머에서 반환하는 값을 새 시드 값으로 사용합니다.

 

Randomize문을 사용하지 않으면 인수가 없는 Rnd 함수에서는 처음 호출되었을 때의 동일한 값을 시드 값과 같은 숫자를 사용한 다음 그 이후로는 마지막으로 발생한 숫자를 시드 값으로 사용합니다.

 

주의  난수 발생 순차를 반복하려면, 숫자 인수를 Randomize문에 사용하기 바로 전에 Rnd 함수를 음수 인수로 호출합니다.

         같은 값의 수를 Randomize문에 사용하면 이전의 순차를 반복하지 않습니다.

 

Randomize 문의 사용법
01.<%
02.Dim rndValue, rndSeed
03.rndSeed = 40  '1~40
04.  
05.Randomize   ' 난수 발생기 초기화
06.rndValue = Int((rndSeed * Rnd) + 1) ' 1에서 40까지 무작위 값 발생
07.  
08.Response.Write rndValue
09.%>

 

여기까진 기본 이론이고..

 

메인 LINE TALK 에 초기 이미지를 랜덤하게 셋팅해주고자 1부터 40까지의 난수를 발생시켜봤다.

이참에 임시 비밀번호나 코드를 발급에도 용이하도록 지정된 길이로 숫자/문자 난수를 만들어내는 함수를 만들어본다

 

원하는 길이로 랜덤 숫자, 문자열 만들기
01.<%
02.'지정길이로 랜덤 숫자 만들기 (최대 15자리)
03.Function Func_getRndNum(ByVal rLen)
04.          IF rLen > 15 Then rLen = 15
05.  
06.          Dim idx, rndSeed, rndSeed2
07.          rndSeed = ""
08.          rndSeed2 = "1"
09.  
10.          For idx = 1 To rLen
11.                    rndSeed = rndSeed &"1"
12.                    rndSeed2 = rndSeed2 &"0"
13.          Next
14.  
15.          rndSeed = Int(rndSeed)
16.          rndSeed2 = Int(rndSeed2)
17.  
18.          Randomize
19.          Func_getRndNum = Int(Rnd(rndSeed)*rndSeed2)
20.End Function
21.  
22.'지정길이로 랜덤 문자 만들기
23.Function Func_getRndChr(ByVal rLen)
24.          Dim rtnStr
25.  
26.          Randomize
27.          For idx = 1 To rLen
28.                    rtnStr = rtnStr & Chr(Int(2*Rnd)*32 + Int((90-65+1)*Rnd + 65))
29.          Next
30.  
31.          Func_getRndChr = rtnStr
32.End Function
33.  
34.Response.Write "랜덤숫자 : "& Func_getRndNum(5) &"<br>"
35.Response.Write "랜덤문자 : "& Func_getRndChr(10) &"<br>"
36.%>

 

심플하게 정리해보자면..

 

 Int(Rnd(11111) * 100000

5자리 랜덤 숫자를 만들려면 이처럼 1과 0의 갯수를 5개로 만들어주면 OK.

대신 자릿수가 너무 커지면 Overflow~

 

그리고 001 ~ 040 까지의 값을 원한다면 첫번째 예제를 이용해서 1~40까지의 랜덤수를 생성하고

 Right("00" & Int((40 * Rnd) + 1), 3

이렇게 자릿수를 맞춰주면 된다.

 

출처 - http://www.devholic.net/1000448

콘솔창에서는 주로 문자를 입출력하는데 다음 입출력될 위치는 커서가 가리킨다. 사용자는 주기적으로 깜박거리는 커서를 보고 자신이 입력한 문자가 이 위치에 나타난다는 것을 알 수 있으며 또한 다음 출력될 위치도 알게 된다. 통상적인 경우 커서는 꼭 필요하지만 게임같은 경우에는 커서가 오히려 게임 진행에 방해가 되므로 표시하지 않는 것이 더 좋다. 14장의 여러 게임들을 실행해 보면 커서가 보이지 않는데 커서가 있는 상태로 게임을 실행해 보면 이 함수가 왜 필요한지를 알 수 있을 것이다.

setcursortype 함수는 커서의 형태를 변경하는데 괄호안의 인수로 NOCURSOR를 전달하면 커서가 사라지고 NORMALCURSOR라고 주면 커서가 다시 나타난다. 게임을 시작하기 전에 커서를 없애 버리는 것이 좋고 게임이 끝날 때 다시 나타나도록 한다. 물론 커서는 잠시 숨겨지는 것이지 커서 자체가 없어지는 것은 아니다. 커서는 보통 문자 아래쪽의 얇은 두 줄로 표시되는데 SOLIDCURSOR로 지정하면 문자 높이만큼의 크기를 가진다.

#include <stdio.h>
#include <conio.h> //getch()
#include <windows.h> //SetConsoleCursorInfo(), GetStdHandle(), CONSOLE_CURSOR_INFO

#define TRUE 1
#define FALSE 0
typedef enum {NOCURSOR, SOLIDCURSOR, NORMALCURSOR}CURSOR_TYPE;

void setcursortype(CURSOR_TYPE);

void main()
{
 setcursortype(NORMALCURSOR);
 printf("Normal cursor type.\n");
 getch();
 setcursortype(SOLIDCURSOR);
 printf("Big cursor type\n");
 getch();
 setcursortype(NOCURSOR);
 printf("No cursor type\n");
 getch();
 setcursortype(NORMALCURSOR);
}

void setcursortype(CURSOR_TYPE c)
{
 CONSOLE_CURSOR_INFO Curinfo; // console sursor 구조체
 switch(c)
 {
 case NOCURSOR:
  Curinfo.dwSize = 1; //cursor size
  Curinfo.bVisible = FALSE; // cursor 안보임
  break;
 case SOLIDCURSOR:
  Curinfo.dwSize = 100;
  Curinfo.bVisible = TRUE;
  break;
 case NORMALCURSOR:
  Curinfo.dwSize = 20;
  Curinfo.bVisible = TRUE;
  break;
 }
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Curinfo);
}
/* GetStdHandle(STD_OUTPUT_HANDLE) : 현제 console의 handle을 구하는 함수
SetConsoleCursorInfor(consoleHandle, consoleCursorInformationStruct)
*/

 

 

출처 - http://sotooto.blogspot.kr/2010/05/setcursortype%EC%BB%A4%EC%84%9Conoff.html

+ Recent posts