컴퓨터 엑셀 워드 포토숍 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Monthly Archive
Wednesday, January 31, 2007

C언어] printf() 함수 출력을, 문자열로 저장하는 법; printf to String

printf() 함수는 화면에 글자나 숫자를 출력하는 함수입니다. 그런데 화면 출력이 아니라, printf() 함수의 출력 결과 자체를 문자열로 저장해야 할 때가 있습니다. 이때는 sprintf() 함수를 대신 사용하면 됩니다. 둘다 "형식 지정" 방법은 똑같고, 사용법만 약간 다릅니다.

sprintf(문자열이 저장될 버퍼, "형식 지정", 값);

의 형식입니다.

printf 출력을 문자열로 만들기(변환) 예제


소스 파일명: example.cpp
#include <stdio.h>

int main(void) {
  char s[80]; // sprintf()의 출력이 저장될 버퍼


  // 10진수를 16진수 문자열로 변환
  sprintf(s, "0x%02X", 255);

  printf("%s\n", s);
  // 출력 결과: 0xFF




  // 1자리 숫자를 3자리 숫자(문자열)로 만들기
  sprintf(s, "%03d", 2);

  printf("%s\n", s);
  // 출력 결과: 002


  return 0;
}


위의 0xFF 나 002 는 더 이상 숫자가 아니고 문자열입니다.


▶▶ C언어/Perl] printf() 함수의 포맷 스트링 %s, %d - Format Specifier

C언어] 나머지 값 연산자 사용 법, 퍼센트 기호(%); Modulus Operator, get Remainder

나머지 연산자(Modulus Operator)인 % 기호는, 2개의 숫자를 나누었을 때 그 나머지(Remainder)를 구합니다. 몫이 아니고...

예를 들어

13 % 5

이 경우, 13을 5로 나누면 딱 떨어지지 않고 3이라는 나머지가 남습니다. 그 나머지 3을 얻습니다.

공학용 계산기에 보면 Mod 라는 버튼이 있는데 바로 그것과 같은 역할을 합니다.
공학용 계산기: 윈도우

윈도우 공학용 계산기 (클릭하면 확대, 옆으로 스크롤 가능) ▶▶ 계산기로, 파이 값 (원주율) 구하기; PI - Calc Scientific


나머지 연산자로, 나머지 값 구하기 예제


소스 파일명: example.cpp
#include <stdio.h>


int main(void) {

  int result;

  result = 10 % 5;
  printf("나머지: %d\n", result);
  // 출력 결과: 0
  // 10을 5로 나누면, 딱 떨어지고 나머지는 없기에 0(영)입니다.


  result = 10 % 2;
  printf("나머지: %d\n", result);
  // 출력 결과: 0
  // 마찬가지입니다. 나머지는 0입니다.


  result = 13 % 5;
  printf("나머지: %d\n", result);
  // 출력 결과: 3
  // 13을 5로 나누면 나머지는 3입니다.


  printf("나머지: %d\n", 13 % 2);
  // 출력 결과: 1


  return 0;
}


그러나 printf 함수 속에 있는 "%d" 이런 것은 나머지 연산자가 아니라 출력 형식을 지정하는 것입니다. %d 라는 것은 숫자를 정수로 출력하라는 뜻입니다. 참고: ▶▶ C언어/Perl] printf() 함수의 포맷 스트링 %s, %d - Format Specifier


나누기, 몫, 나머지 값 계산기: ▶▶ 나누기 계산기; 나눗셈의 몫 나머지 값 구하기; Remainder Calc

% 연산자의 실용적인 예제들:

▶▶ C언어] 특정 연도, 윤년 여부 판단 함수; is Leap Year Function

짝수 홀수 판단에 %연산자 사용: ▶▶ C언어] 짝수 홀수 판단하기 - Even, Odd Number

4자리 연도를 2자리로 바꾸는 데 사용: ▶▶ C언어] 올해 연도(년도) 4자리, 2자리로 구하기/출력; Current Year Format; YYYY, YY


C언어] 올해 연도(년도) 4자리, 2자리로 구하기/출력; Current Year Format; YYYY, YY

연도는 1999년 이렇게 4자리로 표현할 수도 있고, 그냥 99년 이렇게 2자리로 표현할 수도 있습니다. 년도를 두 자리로 나타내려면 "나머지 연산자(%)"를 사용하여 % 100 이렇게 하면 됩니다. 즉, 4자리 년도를 100으로 나눈 후, 그 나머지를 구하면 2자리 년도가 나옵니다.

이번 해의, 년도를 네자리/두자리로 얻기 예제


소스 파일명: example.cpp
#include <stdio.h>
#include <time.h>

int getCurrentYear(void);


int main(void) {

  int cyear = getCurrentYear();


  // 이번 해 연도를 4자리로 구하기
  printf("올해(YYYY)는 %04d 년입니다.\n", cyear);


  // 이번 해 연도를 2자리로 구하기
  printf("올해(YY)는 %02d 년입니다.\n", cyear % 100);


  return 0;
}




int getCurrentYear(void) {
  time_t timer;
  struct tm *t;

  timer = time(NULL);
  t = localtime(&timer);

  return t->tm_year + 1900;
}



컴파일 및 실행 결과 화면:
(컴퓨터 시간을 바꾸어 가며 실행시킨 결과임)
D:\Z>cl /nologo example.cpp && example.exe
example.cpp
올해(YYYY)는 2007 년입니다.
올해(YY)는 07 년입니다.

D:\Z>cl /nologo example.cpp && example.exe
example.cpp
올해(YYYY)는 2001 년입니다.
올해(YY)는 01 년입니다.

D:\Z>cl /nologo example.cpp && example.exe
example.cpp
올해(YYYY)는 2000 년입니다.
올해(YY)는 00 년입니다.

D:\Z>cl /nologo example.cpp && example.exe
example.cpp
올해(YYYY)는 1999 년입니다.
올해(YY)는 99 년입니다.

D:\Z>cl /nologo example.cpp && example.exe
example.cpp
올해(YYYY)는 1991 년입니다.
올해(YY)는 91 년입니다.

D:\Z>



▶▶ C언어] 현재 날짜/시간/년월일,시분초 구하기 함수(오늘 날짜 시간): Current Date, Time

C언어] 올해가 윤년인지 평년인지 판단 예제; Current Year is Leap Year?

이번 해가 윤년인지 아닌지 알아내는 방법입니다. 여기에 있는 isLeapYear 함수를 사용합니다: ▶▶ C언어] 특정 연도, 윤년 여부 판단 함수; is Leap Year Function

그리고 getCurrentYear() 함수로, 이번 년도를 4자리로 구합니다.

단, 서기 1582년이 되기 전의 윤년은 구할 수 없습니다. 즉, 현행 그레고리력의 윤년만 구할 수 있고, 그 전의 율리우스력의 윤년은 구하지 못합니다.

이번 해가 윤년인지 평년인지 알아내기 예제


소스 파일명: example.cpp
#include <stdio.h>
#include <time.h>

int isLeapYear(int year);
int getCurrentYear(void);


int main(void) {

  int cyear = getCurrentYear();

  printf("올해는 %d 년입니다.\n", cyear);

  if (isLeapYear(cyear)) {
    puts("윤년입니다");
  } else {
    puts("평년입니다");
  }

  return 0;
}




int isLeapYear(int year) {
  if (year % 4)   return 0;
  if (year % 100) return 1;
  if (year % 400) return 0;

  return 1;
}


int getCurrentYear(void) {
  time_t timer;
  struct tm *t;

  timer = time(NULL);
  t = localtime(&timer);

  return t->tm_year + 1900;
}



컴파일 및 실행 결과 화면:
(컴퓨터 시간을 바꾸어 가며 실행시킨 결과임)
D:\Z>cl /nologo example.cpp && example.exe
example.cpp
올해는 2007 년입니다.
평년입니다

D:\Z>cl /nologo example.cpp && example.exe
example.cpp
올해는 2008 년입니다.
윤년입니다

D:\Z>cl /nologo example.cpp && example.exe
example.cpp
올해는 2004 년입니다.
윤년입니다

D:\Z>cl /nologo example.cpp && example.exe
example.cpp
올해는 2001 년입니다.
평년입니다

D:\Z>cl /nologo example.cpp && example.exe
example.cpp
올해는 2000 년입니다.
윤년입니다

D:\Z>



C언어] 특정 연도, 윤년 여부 판단 함수; is Leap Year Function

지정한 특정 년도가 윤년인지 평년인지 알아내는 함수입니다. isLeapYear() 함수는 윤년이면 참(1)을, 평년이면 거짓(0)을 반환합니다.

단, 서기 1582년이 되기 전의 윤년은 구할 수 없습니다.

윤년 구하기 예제


소스 파일명: example.cpp
#include <stdio.h>

int isLeapYear(int year);


int main(void) {

  if (isLeapYear(2008)) {
    puts("윤년입니다");
  } else {
    puts("평년입니다");
  }
  // 출력 결과: 윤년입니다




  if (isLeapYear(2007)) {
    puts("윤년입니다");
  } else {
    puts("평년입니다");
  }
  // 출력 결과: 평년입니다

  return 0;
}




int isLeapYear(int year) {
  if (year % 4)   return 0;
  if (year % 100) return 1;
  if (year % 400) return 0;

  return 1;
}



서기 1582년부터 사용되고 있는 현행 그레고리력(Gregorian Calendar)의 윤년만 구할 수 있고, 그 전의 율리우스력(Julian Calendar)의 윤년은 구하지 못합니다. 따라서 여기의 isLeapYear 함수는 일상용이지 학술적인 용도로는 사용할 수 없습니다. 참고: ▶▶ Perl/펄] 윤년 평년 여부 판단 함수; is Leap Year

고대의 윤년까지 구하려면 자바를 사용하는 것이 좋습니다: ▶▶ Java/자바] 특정 연도, 윤년 여부 판단 메소드(함수); is Leap Year 사용법



이번 해의 윤년 여부 판단: ▶▶ C언어] 올해가 윤년인지 평년인지 판단 예제; Current Year is Leap Year?

Excel/엑셀 팁] 위쪽 셀의 내용/값/수식, 현재 셀에 자동 복사 핫키; Cell Auto Copy Hotkey

키보드의 Ctrl+D 키를 누르면, 즉 Ctrl키를 누르면서 D키를 누르면, 위쪽 셀의 값이나 수식이 아래쪽의 현재 셀에 그대로 복사됩니다. 같거나 비슷한 내용을 아래쪽으로 계속 써 나갈 때에는 Ctrl+D 키를 누르면 됩니다. 물론 Ctrl+C키로 복사하여, Ctrl+V키로 붙여 넣어도 되지만, 이 핫키가 편리하더군요.

그리고 다음과 같이 마우스로도 셀을 이동/복사할 수 있습니다:


마우스로 셀 이동/복사 방법


현재 선택된 셀의 가장자리에 마우스를 살짝 가져가면 "동서남북 4방향의 커서"로 마우스 커서가 바뀝니다. 다음 그림의 (2)번 그림과 같습니다.
엑셀: 수식 자동 채우기 - Excel AutoFill

이 상태로 셀을 다른 곳에 끌어다 놓으면 셀이 다른 곳으로 "이동"됩니다. 그리고 Ctrl키를 누른 상태에서 셀을 이동시키면 셀이 이동되지 않고 "복사"가 됩니다.



자동으로 복사하여 셀 채우기: ▶▶ Excel/엑셀] 셀에 값 자동 채우기, 숫자 자동 증가 입력 하는 법; AutoFill Numbers

Tuesday, January 30, 2007

Perl/펄] 올해가 윤년인지 평년인지 판단 예제; Current Year is Leap Year?

이번 해가 윤년인지 아닌지 알아내는 방법입니다. 여기에 있는 isLeapYear 함수를 사용합니다: ▶▶ Perl/펄] 윤년 평년 여부 판단 함수; is Leap Year

그리고
(localtime)[5] + 1900
이렇게 하면 현재 연도를 4자리로 구할 수 있습니다.

이번 해가 윤년인지 평년인지 알아내기 예제


파일명: example.pl
#!/usr/bin/perl
use strict; use warnings;

  my $current_year = (localtime)[5] + 1900;

  print "올해는 ", $current_year, " 년입니다.\n";


  if (isLeapYear($current_year)) {
    print "윤년입니다\n";
  } else {
    print "평년입니다\n";
  }




sub isLeapYear {
  my $year = shift;

  return 0 if $year % 4;
  return 1 if $year % 100;
  return 0 if $year % 400;

  return 1;
}



출력 결과 (올해가 2007년일 경우) :
올해는 2007 년입니다.
평년입니다


출력 결과 (올해가 2008년일 경우) :
올해는 2008 년입니다.
윤년입니다


펄 강좌와 각종 예제

Perl/펄] 윤년 평년 여부 판단 함수; is Leap Year

펄로, 특정 연도가 윤년인지 아닌지 알아내는 예제입니다.

isLeapYear 함수는, 윤년일 때는 참(1)을, 평년일 때는 거짓(0)을 반환합니다.

나머지 연산자(%)로 나머지를 구할 때, 나머지가 없으면 0이 되고, 0은 거짓이기에 if문 앞의 return문이 실행되지 않고, 다음줄이 계속 실행됩니다.

만약 나머지가 있으면, 즉, 나누어 떨어지지 않으면 return문이 실행되어 isLeapYear 함수가 종료되고, 논리값을 반환합니다. 0은 거짓, 1은 참입니다.

지정한 해가, 윤년인지 평년인지 알아내기


파일명: example.pl
#!/usr/bin/perl
use strict; use warnings;


  if (isLeapYear(2008)) {
    print "윤년입니다\n";
  } else {
    print "평년입니다\n";
  }
  # 출력 결과: 윤년입니다




  if (isLeapYear(2007)) {
    print "윤년입니다\n";
  } else {
    print "평년입니다\n";
  }
  # 출력 결과: 평년입니다




sub isLeapYear {
  my $year = shift;

  return 0 if $year % 4;    # 4로 나누어 떨어지지 않으면 평년
  return 1 if $year % 100;  # 4로 나누어 떨어지는 해에서, 100으로 나누어 떨어지지 않으면 윤년
  return 0 if $year % 400;  # 4로 나누어 떨어지는 해에서, 400으로 나누어 떨어지지 않으면 평년

  return 1;
}


원래 윤년 계산 소스는 좀 복잡한데

원본 소스: How To Calculate Leap Years with Perl

이 주소에 위와 같은 아주 간결한 소스가 있었습니다. 너무 간단해서 제대로 작동하는지, 자바의 isLeapYear() 메소드와 서기 1582년에서 서기 10000년까지 비교하며 테스트를 해보았는데 완벽했습니다.


다만, 이 펄 함수로는 1582년이 되기 전의 윤년은 계산하기 곤란합니다. 왜냐하면 1582년이 되기 전에는 그레고리력이 아닌 율리우스력(Julian Calendar)이 사용되었기 때문입니다.

자바의 isLeapYear() 메소드는 1582년이 되기 전은 율리우스력으로 윤년을 구하고, 1582년부터는 그레고리력(Gregorian Calendar)으로 윤년을 구합니다.

학술적으로는 자바 쪽이 정확합니다.

따라서 여기의 펄 함수는 일상적인 용도에만 적합합니다.



▶▶ Perl/펄] 올해가 윤년인지 평년인지 판단 예제; Current Year is Leap Year?

펄 강좌와 각종 예제

HTML-CSS] 텍스트 중앙(가운데) 정렬, 양쪽/우측/좌측 맞춤 태그; Text Align Tag

텍스트나 문단은 기본적으로 "왼쪽 맞춤"입니다. 즉, 왼쪽에 찰싹 붙어 있습니다. 이것을 가운데나 오른쪽 또는, 워드프로세서처럼 "양쪽 맞춤"으로 정렬하는 방법입니다. text-align 이라는 CSS 속성을 사용하는 것이 웹 표준입니다.

예를 들어, 임의의 HTML 태그 안에 style="text-align:center" 이런 스타일을 지정하면 중앙 정렬이 됩니다.


좌우 맞춤 / 가운데 정렬 / 양쪽 맞춤 등 예제


파일명: example.html
(※ 스크롤 박스 사용법: 박스 안을 마우스로 클릭한 후, 키보드의 좌우 화살표키를 누르면 양옆으로 움직일 수 있습니다. 박스에서 다시 나오려면, 박스 바깥의 아무곳이나 클릭하면 됩니다.)
<html>
<head>
<style type="text/css">
/* 이해를 돕기 위해, div 박스에 테두리를 붙이는 코드 */
div { border:1px solid; padding:10px; }
</style>
</head>


<body>

<strong>왼쪽 정렬(왼쪽 맞춤)</strong> : 좌측 정렬이 기본값입니다. 즉, text-align:left 이런 스타일을 지정하지 않아도, 왼쪽 정렬이 됩니다.
<div style="text-align:left">
산길을 등지며 시가지로 내려왔었다.<br />
열쇠고리를 산길에 버렸었지만, 마치 지니고 있는 것 같은 느낌이 들어서 호주머니 속으로 손을 넣었다.<br />
고개를 들어 보니, 머리 위로 희미한 햇빛이 비치고 있었다.<br />
산길 위에 서서, 빗속의 먼 어딘가를 하염없이 바라보는 듯한 암울한 기분에서 헤어날 수 없었다.<br />
</div>
<br /><br />



<strong>오른쪽 정렬(오른쪽 맞춤)</strong>
<div style="text-align:right">
산길을 등지며 시가지로 내려왔었다.<br />
열쇠고리를 산길에 버렸었지만, 마치 지니고 있는 것 같은 느낌이 들어서 호주머니 속으로 손을 넣었다.<br />
고개를 들어 보니, 머리 위로 희미한 햇빛이 비치고 있었다.<br />
산길 위에 서서, 빗속의 먼 어딘가를 하염없이 바라보는 듯한 암울한 기분에서 헤어날 수 없었다.<br />
</div>
<br /><br />



<strong>가운데(중앙) 정렬</strong> : "제목" 등에서 중앙 정렬을 주로 사용합니다.
<div style="text-align:center">
산길을 등지며 시가지로 내려왔었다.<br />
열쇠고리를 산길에 버렸었지만, 마치 지니고 있는 것 같은 느낌이 들어서 호주머니 속으로 손을 넣었다.<br />
고개를 들어 보니, 머리 위로 희미한 햇빛이 비치고 있었다.<br />
산길 위에 서서, 빗속의 먼 어딘가를 하염없이 바라보는 듯한 암울한 기분에서 헤어날 수 없었다.<br />
</div>
<br /><br />



<strong>양쪽 맞춤 (양쪽 정렬)</strong> : 워드프로세서에서처럼, 줄바꿈을 하지 않고 즉 Enter키를 치지 않고 1줄로 1문단을 이어서 써야 제대로 양쪽 맞춤이 됩니다.
<div style="text-align:justify">
산길을 등지며 시가지로 내려왔었다. 열쇠고리를 산길에 버렸었지만, 마치 지니고 있는 것 같은 느낌이 들어서 호주머니 속으로 손을 넣었다. 고개를 들어 보니, 머리 위로 희미한 햇빛이 비치고 있었다. 산길 위에 서서, 빗속의 먼 어딘가를 하염없이 바라보는 듯한 암울한 기분에서 헤어날 수 없었다.
</div>


</body>
</html>




위의 코드, 브라우저 출력 결과 화면


왼쪽 정렬(왼쪽 맞춤) : 좌측 정렬이 기본값입니다. 즉, text-align:left 이런 스타일을 지정하지 않아도, 왼쪽 정렬이 됩니다.
산길을 등지며 시가지로 내려왔었다.
열쇠고리를 산길에 버렸었지만, 마치 지니고 있는 것 같은 느낌이 들어서 호주머니 속으로 손을 넣었다.
고개를 들어 보니, 머리 위로 희미한 햇빛이 비치고 있었다.
산길 위에 서서, 빗속의 먼 어딘가를 하염없이 바라보는 듯한 암울한 기분에서 헤어날 수 없었다.





오른쪽 정렬(오른쪽 맞춤)
산길을 등지며 시가지로 내려왔었다.
열쇠고리를 산길에 버렸었지만, 마치 지니고 있는 것 같은 느낌이 들어서 호주머니 속으로 손을 넣었다.
고개를 들어 보니, 머리 위로 희미한 햇빛이 비치고 있었다.
산길 위에 서서, 빗속의 먼 어딘가를 하염없이 바라보는 듯한 암울한 기분에서 헤어날 수 없었다.





가운데(중앙) 정렬 : "제목" 등에서 중앙 정렬을 주로 사용합니다.
산길을 등지며 시가지로 내려왔었다.
열쇠고리를 산길에 버렸었지만, 마치 지니고 있는 것 같은 느낌이 들어서 호주머니 속으로 손을 넣었다.
고개를 들어 보니, 머리 위로 희미한 햇빛이 비치고 있었다.
산길 위에 서서, 빗속의 먼 어딘가를 하염없이 바라보는 듯한 암울한 기분에서 헤어날 수 없었다.





양쪽 맞춤 (양쪽 정렬) : 워드프로세서에서처럼, 줄바꿈을 하지 않고 즉 Enter키를 치지 않고 1줄로 1문단을 이어서 써야 제대로 양쪽 맞춤이 됩니다.
산길을 등지며 시가지로 내려왔었다. 열쇠고리를 산길에 버렸었지만, 마치 지니고 있는 것 같은 느낌이 들어서 호주머니 속으로 손을 넣었다. 고개를 들어 보니, 머리 위로 희미한 햇빛이 비치고 있었다. 산길 위에 서서, 빗속의 먼 어딘가를 하염없이 바라보는 듯한 암울한 기분에서 헤어날 수 없었다.






글이 아닌, 그림(이미지;사진)을 좌우/가운데로 정렬하는 법: ▶▶ HTML-CSS] 이미지/사진, 화면 가운데(중앙)로, 우측으로 정렬 방법; IMG Center Right

일본어 가운뎃점, '가운데 점' 입력 방법; Japanese 'Katakana Middle Dot' Char

일본어에서는, 가운뎃점(가운데점)을, 中黒(なかぐろ;나카구로) 또는 黒丸/黒円(くろまる;구로마루) 또는 中点/中テン(なかてん;나카텐) 등의 여러가지 이름으로 부릅니다.

쌍따옴표 속에 들어 있는
""
이 문자가 바로 일본어에서의 가운뎃점(가운데 점; 미들 닷; Middle Dot)입니다.


""

위의 따옴표 속에 있는 작은 점을 마우스로 긁어서 선택한 후, 키보드의 Ctrl+C키 또는 Ctrl+Insert키를 누르면 메모리 속에 가운데 점이 복사됩니다. 다른 문서에서 Ctrl+V키 또는 Shift+Insert키를 누르면 붙여 넣을 수 있습니다. Ctrl+C키란, Ctrl키를 누르면서 C키를 누르는 것입니다.

단, 오피스나 EmEditor 같이, 일본어 코드를 다룰 수 있는 편집기가 있어야 합니다.

일본어 가운뎃점의 유니코드 번호는 U+30FB 입니다. 이름은 "Katakana Middle Dot"이라고 합니다.


다음과 같이, 동등하거나 밀접한 관계의 단어들을 나열할 때 사용합니다.
国語・英和・和英




키보드로, 일본 가운데점 입력하는 법


일본어 IME를 작동시킨 후, 일본어 입력 모드에서,

Shift+슬래쉬(/)

키를 누르면 가운데점이 찍힙니다. Shift키를 누르면서 빗금(/)키를 누르는 것입니다.


일본어 특수 문자 입력표: ▶▶ 일본어 키보드와 특수문자 / 한글 자판으로 일어 입력 / Japanese Keyboard

한글 가운데점과 일본어 가운데점은 코드가 다릅니다: ▶▶ 가운뎃점 문자 표현, 가운데 점, 중점(中點) 문자 찍는 법: Middle Dot




맞춤법] '가운뎃점'과 '가운데점' 어느 것이 맞나요?



"가운뎃점"이 정확한 표기입니다. 그런데 흔히 '가운데점'으로 적기에 혼용했습니다^^;






Monday, January 29, 2007

Python/파이썬] 이진파일 열기/읽기/출력 예제: Binary File Open-Read Example

이진 파일 즉 바이너리 파일을 열어서 "1바이트씩" 읽어, 화면에 헥사 코드로 출력하는 방법입니다.

open(fname, 'rb')
이렇게 'rb' 라는 모드로 열어야 하는데, r은 읽기용으로 일기, b는 이진 모드로 열기입니다. 따라서, 이진파일을 읽기전용 모드로 여는 것입니다.

바이너리 파일 (이진 파일) 1바이트(Byte)씩 열기 읽기 예제
파일명: example.py
#!/usr/bin/python
# -*- coding: cp949 -*-

import sys


# 파일명을 지정하지 않으면 에러 출력하고 종료
if len(sys.argv) is 1:
  print >> sys.stderr, '읽을 파일명을 입력해 주세요'
  exit(1)




# 명령행 옵션으로 지정한 파일명 얻기
fname = sys.argv[1]



# 파일 내용을, 일 바이트씩 읽어서 화면에 16진수로 출력하기
try:
  FH = open(fname, 'rb')  # 파일 열기

  while True:
    s = FH.read(1)
    if s == '': break
    print '%02X' % int(ord(s)),  # 1바이트씩 출력


  FH.close()  # 파일 닫기
except IOError:
  print >> sys.stderr, '파일을 열 수 없습니다.'




실행 결과 화면:
D:\Z>example.py test.bin
47 49 46 38 39 61 24 00 0E 00 D5 00 00 FF

D:\Z>

test.bin 이라는 이름의 14바이트짜리 이진파일을 읽어서 그 내용을 헥사로 출력했습니다.



텍스트 파일 읽기 예제: ▶▶ Python/파이썬] 텍스트 파일 열기/읽기/출력 예제: Text File Open-Read-Print

파이썬 강좌와 각종 예제

C, Perl에서, 연 파일을 닫아야 하는 이유는? fclose() close()로

파일을 한 번 오픈(open)했으면, 그 파일에 읽기 또는 쓰기 작업을 끝낸 후, fclose() 등의 함수로 (펄은 close()), 그 파일을 닫아 주어야 합니다. 다른 언어에서도 마찬가지입니다.

Q: 파일을 닫지 않으면 어떻게 됩니까?
A: 파일을 닫지 않으면, 프로그램을 종료해도 그 파일의 삭제나 이름 변경이나 이동이 잘 안되는 경우가 생깁니다.

그리고 메모리 속에 그 파일에 대한 정보가 계속 남아 있어서 메모리를 불필요하게 차지할 수도 있습니다. 물론 이런 문제는 컴파일러나 운영체제에 따라 좀 다릅니다. (MS-DOS에서는 시스템 전체가 불안정해지는 경우도 있었습니다.)

Perl(펄) 같은 언어는, 작업 블록을 벗어나면 자동으로 파일이 닫힙니다. 그러나 되도록 close() 함수를 사용하여 명시적으로 닫아주는 것이 안전합니다.

다만 C의 경우, exit() 함수를 사용하여 프로그램을 종료했다면, exit() 함수가 모든 열린 파일들을 자동으로 닫아주기("Before termination, all files are closed...")에 직접 닫을 필요는 없습니다.





펄 강좌와 각종 예제

Python/파이썬] 텍스트 파일 열기/읽기/출력 예제: Text File Open-Read-Print

Python에서, 텍스트 파일을 읽는 방법입니다. 지정해 준 파일을 1줄씩 읽어서, 그 내용 그대로 화면에 출력합니다. 도스(DOS)의 "type 명령"이나, 유닉스의 "cat 명령"과 같은 일을 합니다.

명령행으로 지정한, 텍스트 파일 읽기 예제
파일명: 0.py
#!/usr/bin/python
# -*- coding: cp949 -*-

import sys


# 파일명을 지정하지 않으면 에러 출력하고 종료
if len(sys.argv) is 1:
  print >> sys.stderr, '읽을 텍스트 파일명을 입력해 주세요'
  exit(1)




# 명령행 옵션으로 지정한 파일명 얻기
fname = sys.argv[1]



# 파일 내용을, 한 줄씩 읽어서 화면에 출력하기
try:
  FH = open(fname)  # 파일 열기

  for s in FH:
    print s,        # 1줄씩 출력

  FH.close()        # 파일 닫기
except IOError:
  print >> sys.stderr, '파일을 열 수 없습니다.'



open('test.txt')
이렇게 열기 모드를 생략하면
open('test.txt', 'r')
이것과 같이 간주됩니다. 즉, "텍스트 모드로, 읽기전용으로" 열립니다.


테스트용으로 쓸 텍스트 파일:
파일명: test.txt
Getting Started
Menus/Toolbars
Menu Summary

* Compiler Configuration

* CVS Support

FAQ

License Agreement
Sales and Support

가나다라
똠방각하




실행 결과 화면:
D:\Z>0.py
읽을 텍스트 파일명을 입력해 주세요

D:\Z>0.py tttt
파일을 열 수 없습니다.

D:\Z>0.py test.txt
Getting Started
Menus/Toolbars
Menu Summary

* Compiler Configuration

* CVS Support

FAQ

License Agreement
Sales and Support

가나다라
똠방각하


D:\Z>



바이너리 파일 (이진 파일) 읽기: ▶▶ Python/파이썬] 이진파일 열기/읽기/출력 예제: Binary File Open-Read Example

파이썬 강좌와 각종 예제

Python/파이썬] 표준 에러 출력으로, 에러 메시지 출력하는 법: STDERR

print문으로 문자열을 출력하면, 평범한 표준 출력으로 출력됩니다. 에러 메시지는 별도의 "표준 에러 출력"으로 구분하여 출력하는 것이 좋습니다.

print문으로 에러 메시지를 출력하거나, sys.stderr.write() 함수로 출력하는 방법입니다:

print문으로 에러 출력, sys.stderr.write 사용 예제


파일명: 0.py
#!/usr/bin/python
# -*- coding: cp949 -*-

import sys



print >> sys.stderr, '에러가 났습니다.'

sys.stderr.write('또 에러가 났습니다.')




실행 결과 화면:
D:\Z>0.py
에러가 났습니다.
또 에러가 났습니다.
D:\Z>
D:\Z>
D:\Z>0.py > nul
에러가 났습니다.
또 에러가 났습니다.
D:\Z>


2번째 실행 때는 nul 로 재지향을 했지만, 에러 메시지이기에 재지향에서 제외되었습니다.


실용적인 예제: ▶▶ Python/파이썬] 외부 명령어 실행 함수, 외부 프로그램 호출 실행; System, Exec

▶▶ Python/파이썬] print문 줄바꿈 없이 출력; No Newline, print, sys.stdout.write()

파이썬 강좌와 각종 예제

Python/파이썬] 외부 명령어 실행 함수, 외부 프로그램 호출 실행; System, Exec

os.system() 함수로, 외부 명령이나 외부 프로그램을 호출하여, 파이썬 안에서 실행할 수 있습니다. 아래 예제는 윈도우의 dir 명령을 파이썬 안에서 실행하는 것입니다. 'dir' 이렇게 하면 그냥 dir 명령이 실행되고, 'dir /?' 이렇게 옵션을 줄 수도 있습니다.

윈도우에서, os.system() 함수는, 외부 명령의 반환값(Return Value)을 그대로 돌려주는데, 일반적으로 에러가 없으면 0이고, 정상적으로 실행되지 않았으면 0이 아닌 값을 반환합니다. 이 반환값으로 외부 명령어/프로그램이 정상적으로 잘 실행되었는지 판단할 수 있는데, 항상 정확한 것은 아닙니다.

Python에서, 시스템 외부 명령, EXE 등, 호출 실행 예제


파일명: 0.py
#!/usr/bin/python
# -*- coding: cp949 -*-

import os
import sys

e = os.system('dir')

if not e == 0:
  print >>sys.stderr, '실행 중 에러가 났습니다. 에러 코드:', e



파이썬 강좌와 각종 예제

Java/자바] 일시 중지/정지 Pause 시키기; Enter키를 누르면 계속됩니다 메시지

텍스트 모드 프로그램에서는, "계속하려면 아무 키나 누르십시오 . . ." 등의 메시지를 출력하고, 사용자가 아무 키나 누를 때까지 프로그램을 잠시 정지시켜야 하는 일이 많습니다.

자바에는 키보드 입력을 받을 때까지 프로그램을 일시 중지시키는 메소드(함수)가 준비되어 있지 않아서, 다음 소스의 아래쪽과 같이 pause() 메소드를 직접 만들어야 합니다.

단, 아무키가 아닌 Enter키를 눌렀을 때에만, 중지 상태에서 빠져나오는 한계가 있습니다. 아무 키나 눌러도 빠져 나오게 하는 것은 순수한 자바 코드로는 되지 않더군요.

Enter키를 누를 때까지, 실행 잠시 정지 예제


소스 파일명: Foo.java
import java.io.*;

public class Foo {
  public static void main(String[] args) {

    System.out.print("Enter 키를 누르세요");

    pause(); // '중지'시키기

    System.out.println("중지가 풀렸습니다.");

  }




  public static void pause() {
    try {
      System.in.read();
    } catch (IOException e) { }
  }


}



컴파일 및 실행 결과 화면:
D:\Z>javac Foo.java && java Foo
Enter 키를 누르세요
중지가 풀렸습니다.

D:\Z>javac Foo.java && java Foo
Enter 키를 누르세요yyyyyyyyyyyyyyyhhhhhhhh
중지가 풀렸습니다.

D:\Z>


2번째 실행 때는 엔터키(Enter Key)가 아닌 y키와 h키를 눌렀는데 중지가 풀리지 않았습니다. Enter키를 눌러 주었을 때 결국 pause()에서 빠져 나왔습니다.

"아무 키나 누르면 계속됩니다."가 아닌, "Enter 키를 누르면 계속됩니다."로 작동합니다.

즉, 다른 키는 안 먹히고, Enter 키만 먹힙니다.



지정한 시간 동안 강제로 중지시키는 방법: ▶▶ Java/자바] 프로그램 일시 중지 방법, 실행 잠시 멈추기 메소드; Sleep

Y/N 입력 받기: ▶▶ 자바Java] (Yes/No)? (Y/N)? (예/아니오)? 키보드로 입력 받기, 묻기

자바 강좌와 각종 예제

Sunday, January 28, 2007

Java/자바] 올해가 윤년인지 평년인지 여부 판단; Current Year is Leap Year?

이번 해가 윤년인지 아닌지 판단하는 방법입니다. isLeapYear 메소드를 사용합니다. (▶▶ Java/자바] 특정 연도, 윤년 여부 판단 메소드(함수); is Leap Year 사용법 참고)

이번 해의 윤년/평년 판단 예제


소스 파일명: Foo.java
import java.util.*;

public class Foo {
  public static void main(String[] args) {

    GregorianCalendar cal = new GregorianCalendar();


    if (cal.isLeapYear(cal.get(Calendar.YEAR)))
      System.out.println("윤년입니다.");
    else
      System.out.println("평년입니다.");


  }
}



컴파일 및 실행 결과:
D:\Z>javac Foo.java && java Foo
평년입니다.

D:\Z>


이 글을 쓰고 있는 2007년은 평년이기에 평년이라고 출력되었습니다.

만약 올해가 2004년이었다면 윤년이라고 나옵니다.


자바 강좌와 각종 예제

Java/자바] 특정 연도, 윤년 여부 판단 메소드(함수); is Leap Year 사용법

태양력(그레고리오력; Gregorian Calendar)에서, 어떤 해가, 윤년(閏年; Leap Year)인지 평년인지 판단하는 방법입니다.

태양력에서, 윤년은 2월달의 마지막 날이 28일이 아닌, 29로 늘어나는 해입니다.

isLeapYear() 메소드(함수)는, 파라미터로 입력한 연도가 윤년이면 true(참)를 반환하고, 평년이면 false(거짓) 를 반환합니다.

isLeapYear(): 특정 년도가, 윤년인지 평년인지 판단 예제


소스 파일명: Foo.java
import java.util.*;

public class Foo {
  public static void main(String[] args) {

    GregorianCalendar gregori = new GregorianCalendar();

    int y = 2000;


    if (gregori.isLeapYear(y))
      System.out.println("윤년입니다.");
    else
      System.out.println("평년입니다.");


  }
}



컴파일 및 실행 결과:
D:\Z>javac Foo.java && java Foo
윤년입니다.

D:\Z>

서기 2000년은 윤년입니다. 즉, 2000년 2월달은 29일까지 있었습니다.

참고로, 올해 2007년은 평년입니다.


▶▶ Java/자바] 올해가 윤년인지 평년인지 여부 판단; Current Year is Leap Year?


윤년 목록표 만들기: ▶▶ 윤년 표/목록 (서기 1800년~2300년까지) : Leap Year List

자바 강좌와 각종 예제

Excel/엑셀 VBA] 1, 2, 3, 4분기 구하기 (사분기); Quarter of the Year

1년을, 3개월씩, 4부분으로 나눈 것이 "분기(사분기;Quarter)"입니다.

영문 약자로는
Q1 = 1분기 ( 1,  2,  3월달) = 일사분기
Q2 = 2분기 ( 4,  5,  6월달) = 이사분기
Q3 = 3분기 ( 7,  8,  9월달) = 삼사분기
Q4 = 4분기 (10, 11, 12월달) = 사사분기

로 표현합니다.

(엑셀 비베가 아닌, 엑셀 내장 함수들을 이용하여 분기를 구하는 법은 여기에 있습니다: ▶▶ Excel 엑셀] 이번 달은 몇 분기, 몇 사분기 구하기 함수/수식; Quarter of the Year)


이번 달이, 몇 분기(몇 사분기)인지 구하기 예제


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
Sub Get_Quarter_Year_Example()

  Dim s


  s = Format(Date, "q")
  MsgBox s & "분기"




' 이번 달이 1월달일 경우
' 출력 결과: 1분기

' 이번 달이 2월달일 경우
' 출력 결과: 1분기

' 이번 달이 3월달일 경우
' 출력 결과: 1분기




' 이번 달이 4월달일 경우
' 출력 결과: 2분기

' 이번 달이 5월달일 경우
' 출력 결과: 2분기

' 이번 달이 6월달일 경우
' 출력 결과: 2분기




' 이번 달이 7월달일 경우
' 출력 결과: 3분기

' 이번 달이 8월달일 경우
' 출력 결과: 3분기

' 이번 달이 9월달일 경우
' 출력 결과: 3분기




' 이번 달이 10월달일 경우
' 출력 결과: 4분기

' 이번 달이 11월달일 경우
' 출력 결과: 4분기

' 이번 달이 12월달일 경우
' 출력 결과: 4분기


End Sub



▶▶ Excel/엑셀 VBA] 날짜/시간 (년월일 시분초) 구하기; Date Time Leading Zero

Excel/엑셀 VBA] 12시간제 시간 표현(AM-PM) 오전 오후 출력; 12-hour Clock

엑셀뿐 아니라 프로그래밍에서는 기본적으로 24시간제(24-hour Clock; Military Time)를 사용합니다.

엑셀 비베에서 현재 시간을 12시간제(12-hour Clock)로, 즉 AM (오전; Ante Meridiem)과, PM (오후;Post Meridiem)으로 나누어서 출력하는 방법입니다.

다음 예제와 같이, 오전/오후를 나타내는 형식이 여러가지가 있습니다.

12시간제, 오전 오후 표시 법


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
Sub Time_AM_PM_Example()

  Dim s

' 24시간제
  s = Format(Time, "hh:mm:ss")
  MsgBox s
' 출력 결과: 16:16:38




' 12시간제 (AM 또는 PM 형식)
  s = Format(Time, "hh:mm:ss AM/PM")
  MsgBox s
' 출력 결과: 04:16:49 PM




' 12시간제 (한글로, 오전 오후 형식)
  s = Format(Time, "hh:mm:ss AMPM")
  MsgBox s
' 출력 결과: 04:16:55 오후




' 12시간제 (소문자로, am 또는 pm 형식)
  s = Format(Time, "hh:mm:ss am/pm")
  MsgBox s
' 출력 결과: 04:16:58 pm




' 12시간제 (A/P 1글자로 표기)
  s = Format(Time, "hh:mm:ss A/P")
  MsgBox s
' 출력 결과: 04:17:01 P




' 12시간제 (AM/PM을 초단위 뒤에 찰싹 붙이기)
  s = Format(Time, "hh:mm:ssAM/PM")
  MsgBox s
' 출력 결과: 04:17:05PM




' 12시간제 (가장 간단히 표현)
  s = Format(Time, "hh:mm:ssa/p")
  MsgBox s
' 출력 결과: 04:18:05p


End Sub


▶▶ Excel/엑셀 VBA] 현재 날짜/시간 타임 스탬프 찍기; Time Stamp 24 / 12 Hours

▶▶ Excel/엑셀 VBA] 날짜/시간 (년월일 시분초) 구하기; Date Time Leading Zero

Saturday, January 27, 2007

울트라에디트] 특정 단어 개수 세기, 파일 속 단어 수 구하기/계산 방법; UltraEdit Word Counter

텍스트 파일 문서 속에서, 특정한 단어가 몇 번 나타나는지 알아내는 방법입니다.

* 울트라에디트(UltraEdit)에서, Ctrl+F키를 눌러, Find(찾기) 대화상자를 꺼냅니다.

* Find What (찾을 문자열): 의 입력창에, "찾아서 개수를 셀 단어"를 적어 줍니다.

* Count All (모두 세기) 이라는 버튼을 누르면, 현재 문서에서 그 단어가 몇 번 나타나는지 자동으로 울트라에디터가 세어서 메시지 박스에 출력합니다.

예를 들어 그 단어가 7개 발견되었다면,

7 occurrences found (7개 찾았습니다)

라는 메시지가 나옵니다.




예를 들어, foo 라는 단어를 찾는 경우에, zzzfoooooo 이런 단어 속에 포함되어 있는 foo 도 개수에 포함합니다.

다른 단어 속에 포함된 단어를 숫자 세기에서 제외하려면 Match Whole Word Only 에 체크한 후 개수를 세면 됩니다.




대소문자를 구분하여, 단어 개수를 세려면 Match Case 에 체크합니다.



편집기가 아닌, 펄 프로그래밍으로 단어 개수 세기: ▶▶ Perl/펄] 파일 속의 문자열, 단어 개수 세기; Count All (grep 확장 스크립트)

단어 수, 200자 원고지 장수, 줄 수 계산기: ▶▶ 단어수 세기, 200자 원고지 매수 계산, 줄수 행 개수; Word Counter

울트라에디트 | UltraEdit

로마 숫자 폰트, 로마자 숫자 전각 문자; Roman Numeral Full-Width Character Input

한글 폰트 속에는 다음과 같이 로마 숫자를 쓸 수 있는 전각문자들이 들어 있습니다. (로마자 숫자라고는 하지 않고, 그냥 로마 숫자라고 합니다. 영어로는 로마 숫자를 Roman Numeral 이라고 합니다.)

 ⅰ    Ⅰ
 ⅱ    Ⅱ
 ⅲ    Ⅲ
 ⅳ    Ⅳ
 ⅴ    Ⅴ
 ⅵ    Ⅵ
 ⅶ    Ⅶ
 ⅷ    Ⅷ
 ⅸ    Ⅸ
 ⅹ    Ⅹ

(※ 복사할 부분을 마우스로 긁어서 선택한 후, 키보드의 Ctrl+C키 또는 Ctrl+Insert키를 누르면 메모리 속에 글자들이 복사됩니다. 다른 문서에서 Ctrl+V키 또는 Shift+Insert키를 누르면 붙여 넣을 수 있습니다. Ctrl+C키란, Ctrl키를 누르면서 C키를 누르는 것입니다.)


키보드로 로마 숫자 직접 입력 방법


한글 자모인 "지읒"을



이렇게 입력한 후, 즉시 키보드의 "한자 변환키"를 누릅니다.

그러면 윈도우 화면 오른쪽 밑에, 문자 변환창이 나오고, 변환창의 우측 화살표를 클릭하면, "ⅷ" 이런 로마 숫자들이 보일 것인데, 그것을 클릭하면 로마 숫자의 전각문자가 현재 편집 문서에 찍힙니다.



로마 숫자와 아라비아 숫자 상호 변환 표: ▶▶ 로마 숫자 <―> 아라비아 숫자 변환표; ROMAN NUMERAL Table

▶▶ 한글 특수문자 입력표 - Hangul Special Character Input Table

▶▶ 컴퓨터용어] 반각 문자 / 전각 문자;(半角/全角)의 의미, 차이점- Half-Width / Full-Width Character





Excel/엑셀 VBA] 현재 날짜/시간 타임 스탬프 찍기; Time Stamp 24 / 12 Hours

엑셀 비베에서, 현재 날짜와 시간을 한 줄로 출력하는 방법입니다.

yyyy-mm-dd hh:mm:ss
형식으로 출력하면 "2007-01-27 14:10:17" 이런 식의 24시간제의 문자열이 나오고

yy-mm-dd hh:mm:ss AM/PM
이런 형식을 지정하면 "07-01-27 02:10:23 PM" 이런 12시간제의 문자열이 나옵니다.


yyyy-mm-dd hh:mm:ss 형식으로 날짜 출력 예제


Sub Get_Date_Time_String_Example()

  Dim s

  s = Format(Date, "yyyy-mm-dd") & " " & Format(Time, "hh:mm:ss")
  MsgBox s

  s = Format(Date, "yy-mm-dd") & " " & Format(Time, "hh:mm:ss AM/PM")
  MsgBox s

End Sub



다음과 같은 2개의 메시지 박스가 나옵니다:

---------------------------
Microsoft Excel
---------------------------
2007-01-27 14:10:17
---------------------------
확인
---------------------------


---------------------------
Microsoft Excel
---------------------------
07-01-27 02:10:23 PM
---------------------------
확인
---------------------------


▶▶ Excel/엑셀 VBA] 날짜/시간 (년월일 시분초) 구하기; Date Time Leading Zero

▶▶ Excel/엑셀 VBA] 12시간제 시간 표현(AM-PM) 오전 오후 출력; 12-hour Clock

Favicon (파비콘;사이트 아이콘) 넣는 법, Site Icon HTML Tag(태그); favicon.ico

브라우저 주소창의 URL 왼쪽에 16x16 픽셀의 조그마한 아이콘을 넣는 방법입니다. 이런 아이콘을 "파비콘(favicon; favorites icon)"이라고 합니다. 원래 MS가 IE 브라우저를 위해서 만든 것입니다. 그래서 웹 표준이 아니지만 파이어폭스에서도 잘 지원됩니다.

실은 몇 년 전부터 IE에서는 파비콘이 잘 보이지 않게 되었습니다. 이제는 오히려 파이어폭스에서 파비콘이 더 잘 보이더군요.


favicon.ico 파일 만들기


우선 favicon.ico 라는 파일명의 아이콘 파일을 만들어야 합니다.

마이크로안젤로 같은 아이콘 편집기를 사용하여 만들면 됩니다: ▶▶ 윈도우 아이콘/마우스 커서 편집 프로그램: Microangelo Toolset (마이크로안젤로)

되도록 16x16 픽셀의 소형 아이콘으로 저장해야 합니다.

그런 후 아이콘 파일을 서버에 올립니다. 지오시티(Geocities) 등의 서버에서는 .ico 확장자 파일을 거부하는데, 이때는 favicon.ico 를 favicon.zip 등으로 확장자를 변경하여 업로드한 후, 다시 이름을 favicon.ico 로 고쳐 주어야 합니다.



Favicon 추가 태그


웹페이지의 <head></head> 태그 사이에 다음의 코드를 삽입하면 됩니다.

<link rel="shortcut icon" type="image/x-icon" href="http://www.example.com/favicon.ico" />

위의 코드에서 www.example.com 이라고 된 부분을, 자신의 실제 주소로 바꾸어 주어야 합니다.



브라우저 주소창에 파비콘 (URL 아이콘) 넣기 예제


HTML 페이지의 최종적인 형태는 다음과 같습니다:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />
<title>페이지 제목</title>
<link rel="shortcut icon" type="image/x-icon" href="http://www.example.com/favicon.ico" />
</head>

<body>
... 여기서 부터 본문 시작 ...


헤드 태그 속의 맨 마지막에 넣으면 적당합니다. 별로 중요한 요소가 아닌 것은 되도록 아래쪽에 넣는 것이 좋습니다.


만약 파일명을 favicon.ico 로 할 수 없는 경우에는 다른 파일명을 지정해도 괜찮습니다.

그런데 favicon.ico 파일은 서버의 루트 디렉토리(최상위 디렉토리)에 있어야 합니다. 그렇지 않고 하위 디렉토리 속에 있으면 IE에서 인식을 못하더군요.



IE 6 브라우저에서 Favicon 이 보이지 않는 문제


파이어폭스에서는 Favicon 이 항상 잘 보입니다. 그렇지만 IE 에서는 좀 문제가 있습니다. 해당 사이트의 파비콘을 보기 위해서는, 우선 Ctrl+D키를 눌러 그 사이트에 대한 북마크를 만든 후, IE를 닫고 다시 실행하여 그 사이트를 재방문해야, 주소창에 파비콘이 보이는 문제가 있습니다. 그렇지만 이 방법도 확실하게 잘 되는 것은 아닙니다.




▶▶ HTML-CSS] 메타 태그 종류; META TAG 목록

▶▶ IE 6의 '이미지 도구 모음' 상자를, 완전히 제거하는 메타 태그; (meta Tag) [HTML-CSS]

Excel/엑셀 VBA] 이번 주는, 올해 몇 번째 주? 구하기/출력; get WEEK OF YEAR

이번 주가, 즉, 오늘이 이번 해(YEAR)에서, 몇 번째 주(WEEK)인지 구하는 방법입니다. 자바의 WEEK_OF_YEAR (The week number within the current year) 에 해당하는 것입니다: ▶▶ 자바.Java] 현재 날짜 시간 구하기, 오늘 연월일/시분초 요일 얻기: Get Date Time

1주 ~ 54주까지 있습니다.


오늘이, 이번 해의 몇째 주인지 구하기 예제


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
Sub WEEK_OF_YEAR_example()

  ' 1월 첫째 주 = 1
  MsgBox Format(Date, "ww")


  ' 오늘이 2007-01-27일일 경우
  ' 출력 결과: 4


  ' 오늘이 2007-01-01일일 경우
  ' 출력 결과: 1


  ' 오늘이 2007-12-31일일 경우
  ' 출력 결과: 53


  ' 오늘이 2000-12-31일일 경우
  ' 출력 결과: 54

End Sub


▶▶ Excel/엑셀 VBA] 오늘이 올해 몇 번째 날? 구하기/출력; get DAY OF YEAR

Excel/엑셀 VBA] 날짜/시간 (년월일 시분초) 구하기; Date Time Leading Zero

엑셀 비베로, 현재 날짜와 시간을 연월일 시분초 별로 나누어서 구하는 방법입니다.

그리고 예를 들어, 3일을 03일로 나타내는 것처럼, 날짜 시간의 앞자리에 영(0)을 붙이는 방법도 있습니다.

앞에 0 붙여, 년월일 시분초 구하기 예제


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
Sub Get_Date_Time_Example()

  Dim s


' 년 구하기
  s = Format(Date, "yyyy") & "년"    ' 연도를 4자리로 표현
  s = s & Chr(13)

  s = s & Format(Date, "yy") & "년"  ' 연도를 2자리로 표현
  s = s & Chr(13) & Chr(13)


' 월 구하기
  s = s & Format(Date, "mm") & "월"  ' 빈 자리에 0 붙여 2자리 숫자로
  s = s & Chr(13)

  s = s & Format(Date, "m") & "월"
  s = s & Chr(13) & Chr(13)


' 일 구하기
   s = s & Format(Date, "dd") & "일" ' 빈 자리에 0 붙여 2자리 숫자로
   s = s & Chr(13)

   s = s & Format(Date, "d") & "일"
   s = s & Chr(13) & Chr(13)


' 시 구하기 (24시간제)
   s = s & Format(Time, "hh") & "시" ' 빈 자리에 0 붙여 2자리 숫자로
   s = s & Chr(13)

   s = s & Format(Time, "h") & "시"
   s = s & Chr(13) & Chr(13)


' 분 구하기
   s = s & Format(Time, "nn") & "분" ' 빈 자리에 0 붙여 2자리 숫자로
   s = s & Chr(13)

   s = s & Format(Time, "n") & "분"
   s = s & Chr(13) & Chr(13)


' 초 구하기
  s = s & Format(Time, "ss") & "초"  ' 빈 자리에 0 붙여 2자리 숫자로
  s = s & Chr(13)

  s = s & Format(Time, "s") & "초"
  s = s & Chr(13)


  MsgBox s

End Sub



위의 예제를 실행하면 다음과 같은 내용이 메시지 박스에 출력됩니다:

---------------------------
Microsoft Excel
---------------------------
2007년
07년

01월
1월

27일
27일

07시
7시

08분
8분

22초
22초

---------------------------
확인
---------------------------




비베로 구한 날짜를 엑셀 시트나 워드 문서에 찍는 방법: ▶▶ 엑셀/MS워드 VBA매크로] 현재 날짜, 시간 출력 함수; Excel Word Date Time

▶▶ Excel/엑셀 VBA] 현재 날짜/시간 타임 스탬프 찍기; Time Stamp 24 / 12 Hours

▶▶ Excel/엑셀 VBA] 12시간제 시간 표현(AM-PM) 오전 오후 출력; 12-hour Clock

▶▶ Excel/엑셀 VBA] 1, 2, 3, 4분기 구하기 (사분기); Quarter of the Year

Friday, January 26, 2007

배치 파일 안에서, EXE 파일 실행 법; Batch File에서 실행파일 호출

배치 파일 안에서, ".EXE" 파일을 실행하려면, 배치 파일 안에 파일명을 그냥 써 주면 됩니다.

만약 실행이 되지 않고, 예를 들어 'Rar.exe'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. 등의 에러가 난다면, 그 파일이 다른 디렉토리(폴더)에 있어서 찾지 못하기 때문입니다.

이때는 그 파일이 존재하는 폴더명까지 앞에 붙여서
D:\WINDOWS_\Path\Rar.exe
이런 식으로 해주어야 합니다.

또는 그 실행 파일이 들어 있는 폴더에 패스(Path)를 걸어주면 됩니다.

배치 파일 내부에서 exe 파일 호출 실행 예제


파일명: 0.bat
@echo off

:::::::::::::::::::::::::::::::::::::::::::::::::::
:: Rar.exe 라는 실행 파일을 실행

Rar.exe




:::::::::::::::::::::::::::::::::::::::::::::::::::
:: Rar.exe 파일이, 패스(Path)에 없어도, 실행 가능하게

D:\WINDOWS_\Path\Rar.exe




:::::::::::::::::::::::::::::::::::::::::::::::::::
:: Rar.exe 에 옵션을 지정할 수 있게

Rar.exe %1 %2 %3 %4 %5 %6 %7 %8 %9



▶▶ 배치파일] BAT파일 안에서, 다른 BAT파일 실행/호출 - Batch File - 일괄 파일

배치파일 작성법 강좌와 각종 예제

HTML 태그] 다운로드 링크 만드는 법, 파일에 링크하는 방법; File Download Link

웹페이지에 다운로드 링크를 만들기 위해서는 <a> 라는 태그(Tag)를 사용합니다. 다음과 같은 형식입니다.

<a href="파일 주소/파일명">다운로드 설명</a>



그리고 다음 예제는
www.test.com
이라는 사이트의 루트 디렉토리에 있는
test.zip
이라는 파일을 다운로드하는 링크입니다.

<a href="http://www.test.com/test.zip">test.zip 다운로드</a>


위의 HTML 코드를 웹페이지에 넣으면

test.zip 다운로드

라는 문장이 웹페이지에 나타납니다. 그리고 그 문장을 클릭하면 test.zip 파일이 하드에 다운로드됩니다.


Excel/엑셀 VBA] 2진수 10진수 변환 함수; 이진수 십진수; Dec To Bin / Bin To Dec

엑셀 "추가 기능"에 2진수/10진수 변환 함수가 있긴 있는데, 511 (이진수로는 111111111)을 초과하는 숫자를 다루지 못하는 등의 버그 또는 한계가 있습니다: ▶▶ Excel/엑셀] 2진수 10진수 변환 함수; 이진수 십진수; DEC2BIN / BIN2DEC

그래서 추가 기능 없이도 쓸 수 있고, 큰 숫자도 다룰 수 있는 함수가 필요합니다.

아래는, 일본어판 지식 검색 사이트에서 dec2bin 으로 검색하면 나오는 소스입니다: ▶▶ 일본어판 지식 검색: 教えて!goo (Oshiete goo); 일본의, 네이버 지식인에 해당


비베: 2진수 <-> 10진수 상호 변환 함수; Base-2 (Binary)


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
Function decToBin(Dec As Long) As String

  Do
    decToBin = CStr(Dec Mod 2) & decToBin
    Dec = Dec \ 2
  Loop Until Dec = 0

End Function


Function binToDec(Bin As String) As Long

  For i = 1 To Len(Bin)
    binToDec = binToDec * 2 + CInt(Mid(Bin, i, 1))
  Next

End Function



decToBin() : 10진수를 2진수로 변환하는 함수

binToDec() : 2진수를 10진수로 변환하는 함수


이제 엑셀 시트에서 셀에

=decToBin(553256646)
이라고 하면, 10진수가 2진수로
100000111110100000011011000110
이렇게 변환됩니다.


또한
=binToDec("100000111110100000011011000110")
이렇게 하면, 2진수인
100000111110100000011011000110
이, 10진수인 553256646 으로 변환됩니다.




VBA로 16진수 변환 함수: ▶▶ Excel/엑셀] 16진수 10진수 변환 VBA 함수로, 십육진수/십진수를 추가 기능 없이; hexToDec decToHex


16진법 2진법 10진수, 아스키 유니코드 상호 변환기: ▶▶ 16진수 헥사, 2진수, 10진수, 8진법 변환 계산기; Hex Calc

Excel/엑셀] 2진수 10진수 변환 함수; 이진수 십진수; DEC2BIN / BIN2DEC

엑셀에는 2진수를 다루는 내장 함수가 없기에, "추가 기능"에 체크해야만 합니다.

엑셀을 실행시킨 후

엑셀 메뉴: 도구 > 추가 기능 > 분석 도구

에 체크하고 "확인" 버튼을 누르면, 2진수를 다루는 다음 2종류의 함수를 사용할 수 있습니다.

=DEC2BIN() : 10진수를 2진수로 변환하는 함수

=BIN2DEC() : 2진수를 10진수로 변환하는 함수



이제 셀에
=DEC2BIN(2)
이렇게 입력하면 10 이라는 결과가 나옵니다. 2라는 십진수가, 10이라는 이진수로 변환되었습니다.

=BIN2DEC("10")
이렇게 하면 거꾸로, 10이라는 이진수가 2라는 십진수로 변환됩니다.




그런데 위의 방법은 511을 초과하는 숫자를 다루지 못하는 한계가 있습니다. 다음과 같이 VBA로 변환하는 것이 좋습니다: ▶▶ Excel/엑셀 VBA] 2진수 10진수 변환 함수; 이진수 십진수; Dec To Bin / Bin To Dec


16진수 변환: ▶▶ [엑셀] 10진수/16진수 변환 함수, HEX2DEC / DEC2HEX - 십진수 십육진수 상호 변환 - Excel Hex Dec


16진법 2진법 10진수, 아스키 유니코드 상호 변환기: ▶▶ 16진수 헥사, 2진수, 10진수, 8진법 변환 계산기; Hex Calc

옛날 구글 검색 화면 캡처(스냅샷) - Google 초창기 1998 년도 Capture Snapshot

구글의 초기 화면이, 구글 초창기부터 쿨한 것인 줄 알았는데 그렇지 않았습니다. 구글 설립 연도를 알아보기 위해 위키백과의 Google 항목을 뒤져보다가 다음과 같은 그림을 발견했습니다:

< Google.JPG >
(이 주소를 클릭한 후에 나오는 그림을 한번 더 클릭하면, 전체 화면으로 나옴)

요즘의 구글 화면이 도회적이라면, 옛날 구글에는 토속적인 아름다움이 있군요. 98년이 아주 먼 옛날처럼 느껴집니다.

구글 로고의 끝에 야후처럼 느낌표가 하나 붙어 있습니다.

Stanford Search 라는 항목이 있는데, 아마도 스탠포드 대학 내부 사이트를 검색하는 것 같습니다.

I'm Feeling Lucky 버튼이 처음부터 있었다는 사실도 알 수 있었습니다.

그리고 사이트에 BETA 딱지를 붙이는 것은 구글 초창기부터의 관례였던 것 같습니다.





구글 코리아 2007년도 화면 갈무리


시간이 지나면 기념이 될 것 같아서, 지금 현재의 구글 코리아(Google Korea) 화면을 캡처해 보았습니다.

구글 코리아
(클릭하면 확대)

일본어판 지식 검색: 教えて!goo (Oshiete goo); 일본의, 네이버 지식인에 해당

야후 재팬에 가려서 그리 지명도는 높지 않지만, 일본에는 goo ( http://www.goo.ne.jp/ ) 라는 오래된 포털 사이트가 있습니다. "구우"라고 발음합니다. 처음에는 구글(Google)과 무슨 관련이 있는 줄 알았는데 그렇지는 않았습니다. (goo 는 1997년 3월부터 사업 시작. 위키백과에 의하면 google.com 도메인은 1997년 9월에 만들어졌음)

일본어 지식 검색 사이트


教えて!goo - 質問&回答 (Q&A) コミュニティ
그리고 언젠가부터 goo 에 위와 같은 곳이 생겼더군요. 한마디로 "지식 검색"입니다. 네이버 지식인과 무슨 관련이 있는지는 모르겠습니다.

가르쳐 줘요 (오시에테) goo 라는 뜻입니다.


구글 재팬 Google Japan에서 검색하다가 결과가 없을 때, 위의 "오시에테 구우"에서 검색해 보니 도움이 되었습니다.


Thursday, January 25, 2007

Java/자바] 숫자 앞에 공(0), 제로(영) 붙이기-추가. Leading Zero to Number

예를 들어, 3을 03 이렇게 두 자리로 표현하거나, 55 를 055 이렇게 세자리로 표현하는 방법입니다. 즉, 숫자 앞의 빈자리에 0(영)을 추가하여 자리수를 맞추는 것입니다.

영 추가하여 자릿수 맞추기 예제


소스 파일명: Foo.java
public class Foo {
  public static void main(String[] args) {


    String s = String.format("%02d", 3);
    System.out.println(s);
    // 출력 결과: 03



    System.out.format("%03d%n", 55);
    // 출력 결과: 055
    // %n 은 줄바꿈 문자를 의미



    double d = 123.555;
    System.out.format("%07.2f", d);
    // 출력 결과: 0123.56
    // 실수는, 소수점 이하까지 모두 포함한 길이를
    // 기준으로 지정해야 함
    // 그리고 끝에서 반올림되었음


  }
}


"%02d" 라는 것은, 정수(%d)를 표현하되, 총 2자리로 나타내고, 앞의 빈자리는 0으로 채우라는 뜻입니다.


▶▶ 자바/Java] printf(), sprintf() 함수 포맷 출력 구현, System.out.println()으로

▶▶ Java/자바] 숫자 천단위 쉼표(콤마) 찍기, 3자리마다 Comma 넣기; Commify

자바 강좌와 각종 예제

Java/자바] 날짜/시간 타임 스탬프 출력; Print ISO Time Stamp

예를 들어 "2007-01-25 13:18:46" 이런 식의 현재 날짜/시간 문자열을 화면에 출력하는 방법입니다. 즉, YYYY-MM-DD hh:mm:ss 형식입니다.

C언어의 sprintf 함수에 해당하는 String.format() 메소드를 사용했습니다.

날짜/시간, YYYY-MM-DD hh:mm:ss 형식으로 출력 예제


소스 파일명: Foo.java
import java.util.Calendar;

public class Foo {
  public static void main(String[] args) {

    Calendar cal = Calendar.getInstance( );


    String s = String.format("%04d-%02d-%02d %02d:%02d:%02d",
                                 cal.get(Calendar.YEAR),
                                 (cal.get(Calendar.MONTH) + 1),
                                 cal.get(Calendar.DAY_OF_MONTH),

                                 cal.get(Calendar.HOUR_OF_DAY),
                                 cal.get(Calendar.MINUTE),
                                 cal.get(Calendar.SECOND)
                             );




    System.out.println(s);

  }
}



컴파일 및 실행 결과:
D:\Z>javac Foo.java && java Foo
2007-01-25 13:18:46

D:\Z>



연월일/시분초를 따로 구하기: ▶▶ 자바.Java] 현재 날짜 시간 구하기, 오늘 연월일/시분초 요일 얻기: Get Date Time

영어식(미국식) 날짜 간단히 구하기: ▶▶ Java/자바] Date 클래스; 현재 날짜/시간/요일, 간단히 출력 예제

자바 강좌와 각종 예제

C언어] int64 사용법: 변수 선언, printf()로 출력; int64 : undeclared identifier

64비트 정수인 int64 는 앞에 반드시 "언더스코어 문자(밑줄;_)" 2개를 붙여서 __int64 이렇게 표현해야 합니다. 그렇지 않으면 'int64' : undeclared identifier 라는 에러가 납니다.

__int64 는

-9223372036854775808 ~ 9223372036854775807

이렇게 "구백이십이경..." 의 경 단위 정수를 표현할 수 있습니다.

또한 unsigned __int64 는 0 ~ 18446744073709551615 까지 표현할 수 있습니다.


다음은, __int64 (int64) 형의 변수를 선언하고, __int64형의 상수(리터럴)를 대입한 후 printf() 함수로 출력하는 예제입니다:

▶▶ C언어] 64비트 정수 __int64 사용법: 변수 선언, printf()로 출력

▶▶ C언어] long long 형의 의미, 사용법: 변수 선언, printf()로 출력; int64


C언어] long long 형의 의미, 사용법: 변수 선언, printf()로 출력; int64

C의 자료형 중의 하나인 "long long (또는 signed long long)" 은 64비트 정수입니다. 조 단위를 넘어, 경 단위의 큰 숫자를 표현할 수 있습니다. __int64 와 같은 자료형입니다.

그리고 "부호 없는 64비트 정수형"은 "unsigned long long" 입니다. "unsigned __int64" 와 같습니다.

long long / unsigned long long 사용 예제


소스 파일명: 0.cpp
#include <stdio.h>

int main(void) {

  // long long == signed long long == __int64
  // -9223372036854775808 ~ 9223372036854775807
            long long x = 9223372036854775807i64;

  // unsigned long long == unsigned __int64
  // 0 ~ 18446744073709551615
  unsigned long long ux = 0xFFFFFFFFFFFFFFFFui64;




  // signed
  printf("%I64d\n", x);
  // 출력 결과: 9223372036854775807
  // (구백이십이경삼천삼백칠십이조삼백육십팔억오천사백칠십칠만오천팔백칠)




  // unsigned
  printf("%I64u\n", ux);
  // 출력 결과: 18446744073709551615
  // (천팔백사십사경육천칠백사십사조칠백삼십칠억구백오십오만천육백십오)

  return 0;
}



▶▶ C언어] 64비트 정수 __int64 사용법: 변수 선언, printf()로 출력

Java/자바] 실수의 지수 표기법 (Scientific Notation;과학적 표기법)

예를 들어 1.00 을 1.000000e+00 이런 식으로 표현하는 방법입니다.

printf 함수 스타일의 포맷 출력을 하는 format() 메소드에서 %e 라는 형식 지정자를 사용합니다.


숫자를 지수 표기 법으로 출력 예제


파일명: Foo.java
class Foo {
  public static void main(String[] args) {

    double num;


    System.out.println("    [ -3.0 에서 3.0 까지 ]");

    for (num = -3.0; num <= 3.0; num++)
      System.out.format("%.2f = %e%n", num, num);




    System.out.println();
    System.out.println("    [ 0.0 에서 100.0 까지 ]");

    for (num = 0.0; num <= 100.0; num += 10.0)
      System.out.format("%.2f = %e%n", num, num);




    System.out.println();
    System.out.println("    [ 천 단위 이상 ]");

    num = 1000.0;
    System.out.format("%.2f = %e%n", num, num);

    num = 10000.0;
    System.out.format("%.2f = %e%n", num, num);

    num = 30000.0; // 그리고 e 를 대문자 E 로 출력
    System.out.format("%.2f = %E%n", num, num);

    num = 35555.0;
    System.out.format("%.2f = %e%n", num, num);

    num = 35555.123456789;
    System.out.format("%.2f = %e%n", num, num);

    num = 35555.123456789; // 정밀도 높여 출력
    System.out.format("%.16f = %.16e%n", num, num);




    System.out.println();
    System.out.println("    [ 양수/음수 ]");

    num = 35555.0;
    System.out.format("%.2f = %e%n", num, num);

    num = -35555.0;
    System.out.format("%.2f = %e%n", num, num);




    System.out.println();
    System.out.println("    [ 1보다 작은 수 ]");

    num = 1.0;
    System.out.format("%f = %e%n", num, num);

    num = 0.0;
    System.out.format("%f = %e%n", num, num);

    num = 0.1;
    System.out.format("%f = %e%n", num, num);

    num = 0.01;
    System.out.format("%f = %e%n", num, num);

    num = 0.005;
    System.out.format("%f = %e%n", num, num);

    num = 0.99;
    System.out.format("%f = %e%n", num, num);

    num = -0.99;
    System.out.format("%f = %e%n", num, num);


  }
}


가령 3.555500e+04 이런 숫자가 있을 때

10의 4승에, 3.555500 을 곱하면 35555.00 이 나오게 됩니다.

따라서 3.555500e+04 = 35555.00 입니다.


컴파일 및 실행 결과 화면:
D:\Z>javac Foo.java && java Foo
    [ -3.0 에서 3.0 까지 ]
-3.00 = -3.000000e+00
-2.00 = -2.000000e+00
-1.00 = -1.000000e+00
0.00 = 0.000000e+00
1.00 = 1.000000e+00
2.00 = 2.000000e+00
3.00 = 3.000000e+00

    [ 0.0 에서 100.0 까지 ]
0.00 = 0.000000e+00
10.00 = 1.000000e+01
20.00 = 2.000000e+01
30.00 = 3.000000e+01
40.00 = 4.000000e+01
50.00 = 5.000000e+01
60.00 = 6.000000e+01
70.00 = 7.000000e+01
80.00 = 8.000000e+01
90.00 = 9.000000e+01
100.00 = 1.000000e+02

    [ 천 단위 이상 ]
1000.00 = 1.000000e+03
10000.00 = 1.000000e+04
30000.00 = 3.000000E+04
35555.00 = 3.555500e+04
35555.12 = 3.555512e+04
35555.1234567890000000 = 3.5555123456789000e+04

    [ 양수/음수 ]
35555.00 = 3.555500e+04
-35555.00 = -3.555500e+04

    [ 1보다 작은 수 ]
1.000000 = 1.000000e+00
0.000000 = 0.000000e+00
0.100000 = 1.000000e-01
0.010000 = 1.000000e-02
0.005000 = 5.000000e-03
0.990000 = 9.900000e-01
-0.990000 = -9.900000e-01

D:\Z>



▶▶ 자바/Java] printf(), sprintf() 함수 포맷 출력 구현, System.out.println()으로


지수 표기법 온라인 변환기: ▶▶ 지수 표기법 변환기, 과학적 숫자를 보통 숫자로 변환; Exponential Scientific Notation Convert


자바 강좌와 각종 예제

Perl/펄] 오늘이 올해 몇 번째 날? 구하기/출력; get DAY OF YEAR

오늘이 이번 해(YEAR)에서, 몇 번째 날(DAY OF YEAR)인지, 펄 스크립트로 구하는 방법입니다. 이 프로그램만 있으면 이제 달력을 보며 일일이 날을 세지 않아도 됩니다.


오늘이, 이번 해의 몇째 날인지 구하기 예제


파일명: day.pl
#!/usr/bin/perl
use strict; use warnings;

  printf("오늘은 올해의 몇번째 날: %d\n", (localtime)[7] + 1);


사실상 1줄짜리 프로그램입니다.

(localtime)[7] 이, 오늘이 올해 몇 번째 날인지를 반환합니다.

펄은 1월1일을 0 으로 간주하는데, 더 직관적으로 나오도록, 또한 엑셀과 같은 값이 나오도록,

+1을 하여, 1월1일을 1로 했습니다.

참고: ▶▶ Excel/엑셀 VBA] 오늘이 올해 몇 번째 날? 구하기/출력; get DAY OF YEAR


실행 결과 화면:
(오늘이 2007-01-25일일 경우)
D:\Z>day.pl
오늘은 올해의 몇번째 날: 25

D:\Z>



(오늘이 2007-12-31일일 경우)
D:\Z>day.pl
오늘은 올해의 몇번째 날: 365

D:\Z>



▶▶ Perl/펄] 오늘 날짜/현재 시간 구하기 함수, 년월일/시분초; Get Print Date Time Current

펄 강좌와 각종 예제

Wednesday, January 24, 2007

Excel/엑셀 VBA] 오늘이 올해 몇 번째 날? 구하기/출력; get DAY OF YEAR

오늘이 이번 해(YEAR)에서, 몇 번째 날인지 구하는 방법입니다. 자바의 DAY_OF_YEAR (The day number within the current year) 에 해당하는 것입니다: ▶▶ 자바.Java] 현재 날짜 시간 구하기, 오늘 연월일/시분초 요일 얻기: Get Date Time

1월1일은 1입니다.

오늘이, 이번 해의 몇째 날인지 구하기 예제


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
Sub DAY_OF_YEAR_example()

  ' 1월1일 = 1
  MsgBox Format(Date, "y")


  ' 오늘이 2007-01-24일일 경우
  ' 출력 결과: 24


  ' 오늘이 2007-01-01일일 경우
  ' 출력 결과: 1


  ' 오늘이 2007-12-31일일 경우
  ' 출력 결과: 365

End Sub



▶▶ Excel/엑셀 VBA] 이번 주는, 올해 몇 번째 주? 구하기/출력; get WEEK OF YEAR

▶▶ 엑셀/MS워드 VBA매크로] 현재 날짜, 시간 출력 함수; Excel Word Date Time

Excel/엑셀 VBA] 오늘 요일 이름 구하기, 요일명 출력; Get-Print DAY OF THE WEEK

VBA로 오늘의 요일을 구하는 방법입니다. Format() 함수를 사용합니다. 한글로, 영문으로, 그리고 "요일 번호" 이렇게 3가지를 구합니다.

요일 번호는 요일을 숫자로 변환한 것인데, 날짜를 정교하게 다루는 루틴에서 필요합니다. 일요일은 1번에 해당입니다.


현재 요일명 얻기 예제


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
Sub DAY_OF_THE_WEEK_example()

  '''''''''''''''''''''''''''''''''''''''''''
  ' 이 예제의 출력 결과는
  ' 오늘 요일이 수요일일 경우임
  '''''''''''''''''''''''''''''''''''''''''''

  ' 한글 요일 이름 구하기
  MsgBox Format(Date, "aaaa")
  ' 출력 결과: 수요일


  ' 영문 요일명 구하기
  MsgBox Format(Date, "dddd")
  ' 출력 결과: Wednesday


  ' 요일 번호 구하기: 일요일 = 1
  MsgBox Format(Date, "w")
  ' 출력 결과: 4

End Sub



Excel/엑셀 VBA] 소수점 이하 자릿수 지정 출력; Decimal Point, Decimal Place 실수 자리수

소수점이 있는 실수의 자릿수를 일정하게 지정하는 방법입니다. Format 함수를 사용합니다. Format 함수는 C언어의 sprintf() 함수와 비슷한 역할을 합니다.

실수 숫자의, 소수점 자리 지정 출력 예제


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
Sub Decimal_Place_Example()

  ' 소수점 이하 1자리로 표현
  n = 123.5555
  MsgBox Format(n, "0.0")
  ' 출력 결과: 123.6
  ' 끝에서 반올림됨





  ' 소수점 이하 2자리로 표현
  n = 123.1234
  MsgBox Format(n, "0.00")
  ' 출력 결과: 123.12



' 소수점 이하 3자리로 표현
  n = 123.1234
  MsgBox Format(n, "0.000")
  ' 출력 결과: 123.123



' 소수점 이하 5자리로 표현
  n = 123.1234
  MsgBox Format(n, "0.00000")
  ' 출력 결과: 123.12340



  ' 정수를 소수점 3자리로 표현
  n = 123
  MsgBox Format(n, "0.000")
  ' 출력 결과: 123.000

End Sub



▶▶ Excel/엑셀 VBA] 숫자 앞에 공(0), 제로(영) 붙이기-추가. Leading Zero to Number

▶▶ Excel/엑셀 VBA] 3자리마다 숫자 쉼표 넣기, 천 단위 콤마 찍기; Number Comma, Commify

Excel/엑셀 VBA] 숫자 앞에 공(0), 제로(영) 붙이기-추가. Leading Zero to Number

예를 들어, 3을 03 이렇게 두 자리로 표현하거나, 55 를 055 이렇게 세자리로 표현하는 방법입니다. 즉, 숫자 앞의 빈자리에 0(영)을 추가하여 자리수를 맞추는 것입니다.

영 추가하여 자릿수 맞추기 예제


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
Sub Leading_Zero_Example()

  n = 3
  MsgBox Format(n, "00")
  ' 출력 결과: 03


  n = 55
  MsgBox Format(n, "000")
  ' 출력 결과: 055


  n = 6.333
  MsgBox Format(n, "000.00")
  ' 출력 결과: 006.33

End Sub



숫자 앞에 공백 문자 넣어 정렬: ▶▶ Excel/엑셀 VBA] 숫자 앞에 공백 추가, 자릿수 맞추기 함수; Add Leading Spaces to Number

비베가 아닌 엑셀의 셀에서 0 붙이기: ▶▶ 엑셀 숫자 앞에 0 넣기 방법; Excel 숫자 앞에 0 (영; 제로) 붙이기

▶▶ Excel/엑셀 VBA] 3자리마다 숫자 쉼표 넣기, 천 단위 콤마 찍기; Number Comma, Commify

▶▶ Excel/엑셀 VBA] 소수점 이하 자릿수 지정 출력; Decimal Point, Decimal Place 실수 자리수

Perl Cookbook (펄 쿡북;요리책) 무료로 보기: Free Online Version

Perl Cookbook 이라는 책에 실용적인 펄 예제들이 많이 있어서 아주 유용합니다. (진짜 음식 만드는 요리책이 아니라, 프로그래밍 소스 코드 책입니다.)

아마존 같은 데서 종이책으로 구입할 수도 있지만, 인터넷에서 무료로 볼 수도 있습니다. 출판사인 O'Reilly 에서 공개를 했더군요. 단, 하루에 일정한 페이지만 볼 수 있도록 제한이 되어 있습니다. 그러나 가입 절차는 없습니다.


Perl Cookbook 읽기


http://www.perl.com/

위의 페이지 맨 아래쪽에 Perl Recipe of the Day (오늘의 펄 요리법) 라는 곳이 있습니다.

그곳에서 "Do it now" 라는 링크를 클릭하면,

현재 Perl Cookbook, 2nd Edition 이 연재되고 있습니다. 이것이 최신판일 것입니다. 매일 내용이 바뀝니다. 물론 영문입니다. 종이책도 한글 번역판은 없는 것 같더군요.


각 요리법 페이지 밑에 "Today | Yesterday | 3 days ago | 4 days ago | 5 days ago | 6 days ago | A week ago" 라는 링크들을 클릭해 보면, 다른 요리법들도 볼 수 있습니다.


Perl Cookbook 을 구입하지 않았다면, 매일 위의 주소를 방문해서 읽으면 됩니다.


펄 강좌와 각종 예제

Excel/엑셀 VBA] 3자리마다 숫자 쉼표 넣기, 천 단위 콤마 찍기; Number Comma, Commify

VBA 매크로에서, 숫자 세 자리마다 콤마를 넣는(Commify) 방법입니다. Format 함수를 사용합니다. Format 함수의 2번째 파라미터에 "#,#" 이런 형식 지정자를 넣으면 정수에 천 단위 콤마가 찍힙니다.

소수점이 있는 실수에 콤마를 넣을 때는 "#,#0.00" 이런 형식을 지정합니다. 0.00 이것은 소수점 2자리까지 나오게 하는 것입니다.

천자리 쉼표 넣기 예제


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
Sub Thousands_Separators_Example()

  n = 1234567
  MsgBox Format(n, "#,#")
  ' 출력 결과: 1,234,567

  n = 1234.333
  MsgBox Format(n, "#,#0.00")
  ' 출력 결과: 1,234.33

End Sub



▶▶ Excel/엑셀 VBA] 숫자 앞에 공(0), 제로(영) 붙이기-추가. Leading Zero to Number

▶▶ Excel/엑셀 VBA] 소수점 이하 자릿수 지정 출력; Decimal Point, Decimal Place 실수 자리수

Tuesday, January 23, 2007

C언어 VC] 도스 DIR 명령 구현; 파일 목록(리스트) 출력; 와일드 카드(Wild Card) 지원

도스(DOS)의 dir 명령처럼, 파일 목록을 구하는 소스입니다. 진짜 dir 명령 같은 복잡한 기능은 전혀 없고, 최소한의 기초적인 것만 있습니다.

파일 이름과 날짜와 속성만 나옵니다.

DIR (ls) 명령, FILE LIST 출력 예제; DIR Command Example Source Code


소스 파일명: 0.cpp
#include <stdio.h>
#include <stdlib.h> // exit()
#include <io.h>
#include <errno.h>
#include <time.h>

char* attribToString(unsigned attrib);
char* timeToString(struct tm *t);


int main(void) {
  _finddatai64_t c_file;
  intptr_t hFile;
  struct tm *t;
  char path[] = "*.*";


  if ( (hFile = _findfirsti64(path, &c_file)) == -1L ) {
    switch (errno) {
      case ENOENT:
        printf(":: 파일이 없음 ::\n"); break;
      case EINVAL:
        fprintf(stderr, "Invalid path name.\n"); exit(1); break;
      case ENOMEM:
        fprintf(stderr, "Not enough memory or file name too long.\n"); exit(1); break;
      default:
        fprintf(stderr, "Unknown error.\n"); exit(1); break;
    }
  } // end if
  else {
    printf("-- 파일 목록 --\n");
    do {
      t = localtime(&c_file.time_write);

      printf("%8I64d  %s %s %s\n",
        c_file.size,
        timeToString(t),
        attribToString(c_file.attrib),
        c_file.name);

    } while (_findnexti64(hFile, &c_file) == 0);
  } // end else
  _findclose(hFile);


  return 0;
}




char* attribToString(unsigned attrib) {
  static char s[4 + 1];

  (attrib & _A_ARCH  ) ? s[0] = 'A' : s[0] = ' ';
  (attrib & _A_RDONLY) ? s[1] = 'R' : s[1] = ' ';
  (attrib & _A_HIDDEN) ? s[2] = 'H' : s[2] = ' ';
  (attrib & _A_SYSTEM) ? s[3] = 'S' : s[3] = ' ';

  return s;
}


char* timeToString(struct tm *t) {
  static char s[20];

  sprintf(s, "%04d-%02d-%02d %02d:%02d:%02d",
              t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
              t->tm_hour, t->tm_min, t->tm_sec
          );

  return s;
}


디렉토리(폴더)는 별도로 처리해 주어야 하는데, 디렉토리 처리 부분은 현재 없습니다. 디렉토리도 그냥 일반 파일처럼 보여줍니다.

"*.*" 라는 와일드 카드는 "모든 파일"이라는 뜻입니다.

파일 날짜의 연도는 4자리로, 시간은 초 단위까지 자세히 나옵니다.


컴파일 및 실행 결과 화면:
D:\Z>cl /nologo 0.cpp && 0.exe
0.cpp
-- 파일 목록 --
       0  2007-01-23 14:44:34      .
       0  2007-01-23 14:44:34      ..
      15  2007-01-03 12:49:36 A    0.bat
    1667  2007-01-23 14:44:34 A    0.cpp
   45056  2007-01-23 14:48:15 A    0.exe
      50  2007-01-18 15:31:15 A    0.html
    3735  2007-01-23 14:48:15 A    0.obj
     112  2006-12-16 18:01:10 A    0.php
      46  2007-01-20 11:53:19 A    0.pl
      48  2007-01-20 14:05:58 A    0.py
     151  2007-01-11 12:43:09      0.txt
   45056  2007-01-22 14:54:12 A    00.exe
    2985  2007-01-22 14:54:12 A    00.obj
   45056  2006-12-25 11:06:48 A    1.exe
    3721  2006-12-25 11:06:48 A    1.obj
 2003696  2001-10-27 15:47:34  R   Beatles, The - All My Loving.mp3
    1705  2007-01-22 17:18:22 A    Foo.class
    1864  2007-01-22 17:28:18 A    Foo.java
     941  2007-01-23 09:24:02 A    Foo2.class
       0  2007-01-18 11:06:52      out.txt
      46  2007-01-18 10:51:45 A    test.html
       0  2007-01-13 11:27:49      test.txt
       0  2007-01-17 12:19:19 A    tt
     350  2007-01-17 11:49:17 A    ttt
   45056  2006-12-23 16:12:26 A    x.exe
     515  2006-12-28 16:16:29 A    x.html
    1195  2006-12-23 16:12:26 A    x.obj
     171  2007-01-21 12:03:08 A H  문서.rtf
       0  2006-12-26 11:48:17      새 폴더

D:\Z>



위의 소스에 대한 설명은 여기에 있습니다:

▶▶ C언어] DIR 함수; 디렉토리 파일 검색; 와일드카드 지원; findfirst findnext

▶▶ C언어-VC] 파일 속성(읽기전용/히든 속성 등) 출력; Print File Attributes: ARHS

▶▶ C언어] 파일 타임 스탬프, 파일 날짜 시간 구하기 함수; File Time Stamp, Last Write Date

C언어] unsigned 타입은, unsigned int 인지 unsigned long 인지?

unsigned 라는 자료형은, 숫자에 마이너스(-) 부호가 붙을 수 없고, 항상 플러스라는 뜻입니다. 음수를 표현할 수 없습니다.

그리고 "unsigned" 는 "unsigned int" 와 똑같은 것입니다.

"unsigned int" 를 줄여서 그냥 "unsigned" 라고 합니다.

32비트 컴퓨터에서는 32비트 정수입니다.



signed / signed int


"signed"나 "signed int"는, "int"와 똑같은 자료형입니다. 즉 마이너스 부호가 붙을 수 있는 정수입니다. 음수를 표현할 수 있습니다.

32비트 컴퓨터에서는 32비트 정수입니다.



결론


부호 없는 정수는 "unsigned int" 로 표현하고,

부호 있는 정수는 그냥 "int" 라고 하는 것이 가독성이 높아서 좋습니다.




각 자료형의 범위 표: ▶▶ C언어] 정수 실수 종류(자료형;데이터형), 최소값 최대값; char int float, Data Type Ranges

▶▶ C언어] unsigned 형의 의미, 부호 없는 정수, unsigned int, signed char

Excel/엑셀] 16진수 10진수 변환 VBA 함수로, 십육진수/십진수를 추가 기능 없이; hexToDec decToHex

엑셀에는 16진수를 10진수로, 그리고 10진수를 16진수로 변환하는
=HEX2DEC()
=DEC2HEX()
이런 함수 2개가 있긴 있는데 기본적으로 지원되지 않고, "추가 기능" 속에 있습니다: ▶▶ [엑셀] 10진수/16진수 변환 함수, HEX2DEC / DEC2HEX - 십진수 십육진수 상호 변환 - Excel Hex Dec

그래서 불편하기에, 추가 기능이 없어도 실행되는 VBA함수를 만들면 편리합니다. 다음의

hexToDec() <- 16진수 문자열을, 10진수 숫자로 변환
decToHex() <- 10진수 숫자를, 16진수 문자열로 변환

라는 2개의 함수입니다.


VBA로, 십육진수<->십진수 상호 변환 함수 만들기


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
Function hexToDec(Hex As String) As Long

  hexToDec = Val("&H" & Hex)

End Function


Function decToHex(Dec As Long) As String

  decToHex = Hex(Dec)

End Function


이제 엑셀의 셀에서 예를 들어
=hexToDec("6EAE9")
이렇게 하면, 453353 이라는 결과가 나옵니다. 십육진수인 6EAE9 가, 십진수 453353 으로 변환된 것입니다. 반드시 16진수 파라미터를 큰따옴표로 둘러싸 주어야 합니다.


그리고
=decToHex(453353)
이렇게 하면 6EAE9 라는 결과가 나옵니다. 십진수 453353 이, 십육진수인 6EAE9 로 변환된 것입니다. 참고로, 여기서 6EAE9 는 숫자가 아닌 문자열입니다.



2진수 변환 방법: ▶▶ Excel/엑셀 VBA] 2진수 10진수 변환 함수; 이진수 십진수; Dec To Bin / Bin To Dec


16진법 2진법 10진수 상호 변환기 (온라인 버전): ▶▶ 16진수 헥사, 2진수, 10진수, 8진법 변환 계산기; Hex Calc

Excel/엑셀 VBA] 16진수 상수 FF, 10 표현 방법; Hex Literal (십육진수 리터럴)

C나 자바 등의 언어에서는 예를 들어 FF 라는 16진수를 소스에 그대로 표현하려면

0xFF 이렇게 앞에 0x 라는 접두사를 붙이면 됩니다.

그러나 베이직/비베 계열의 언어에서는 &H 라는 접두사를 붙입니다. "앰퍼샌드+에이치"입니다.

따라서 FF 라는 16진수는 &HFF 이렇게 표현됩니다.

단, 앞쪽 여백의 0(제로)은 무시되기에

0A 는 그냥 A 로, 즉 &HA 이렇게 나옵니다.


십육진수 숫자 표기 방법 / 예제


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
Sub Hexadecimal_Literal_Example()

  n = &HFF
  MsgBox n
  ' 출력 결과: 255
  ' FF 는 10진수로 255임



  n = &H10
  MsgBox n
  ' 출력 결과: 16
  ' 십육진수 10 은, 십진수로 16임



  n = &HA + 1    ' 0A 가 그냥 A 로 표현됨
  MsgBox Hex(n)  ' 이번에는 10진수가 아닌 16진수로 출력
  ' 출력 결과: B
  ' 0B 가 그냥 B 로 표현됨

  ' 십육진수 0A 는, 십진수로 10임
  ' +1을 하니, 0B(십진수로 11)가 출력

End Sub



Excel/엑셀 VBA] Trim, LTrim, RTrim; 양쪽, 왼쪽, 오른쪽 공백 제거 함수

VBA 매크로에서 Trim 함수는 문자열 양쪽(앞뒤)에 있는 공백 문자를 모두 지우는 함수입니다.

LTrim 함수는 문자열 왼쪽 즉 앞쪽의 공백만 지우고(Trim Leading Spaces),

RTrim 함수는 문자열 우측 즉 끝부분의 공백만 지웁니다(Trim Trailing Spaces).


그러나 어느 함수든, 문자열 속에 포함되어 있는 공백은 그대로 둡니다.

또한 여기서 말하는 공백 문자는, 스페이스(Space)와 탭(Tab) 문자를 모두 포함한 것입니다.


문자열 앞 뒤의 불필요한 공백 지우기 예제


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
Sub Remove_Leading_Trailing_Spaces_Example()

  s = "      AAA BBB     CCC       "


  s2 = Trim(s)          ' 양쪽 공백 모두 제거
  s2 = "[" & s2 & "]"   ' 공백 유무 체크 위해 괄호 붙임
  MsgBox s2
  ' 출력 결과: [AAA BBB     CCC]



  s2 = LTrim(s)         ' 앞 부분 공백만 제거
  s2 = "[" & s2 & "]"
  MsgBox s2
  ' 출력 결과: [AAA BBB     CCC       ]



  s2 = RTrim(s)         ' 끝 부분 공백만 제거
  s2 = "[" & s2 & "]"
  MsgBox s2
  ' 출력 결과: [      AAA BBB     CCC]

End Sub



Trim() 함수를 사용하여, 엑셀 시트의 모든 셀의 문자열에서, 앞뒤의 불필요한 공백 자동으로 지우기: ▶▶ Excel/엑셀] VBA매크로, 불필요한 공백 제거, 문자열 앞뒤 스페이스 지우기; Trim Trailing Spaces


앞뒤 공백 삭제 프로그램 (온라인 버전):
▶▶ 앞뒤 공백 삭제 프로그램, 단어 좌우 스페이스 지우기; Remove Trim Leading Trailing Spaces

Excel/엑셀 VBA] 숫자를 문자열로 변환; Number To String

123 이런 진짜 숫자를, "123" 이런 "문자열로서의 숫자"로 변환하는 방법입니다. 즉, 숫자를 문자열로 바꾸는 것입니다.

첫번째 방법은 Str() 함수를 사용하는 것인데, 이 함수는 문자열 맨 앞쪽에 공백문자(스페이스)를 하나 추가합니다. 플러스 마이너스 (+ -) 기호가 들어갈 자리를 확보해 두는 것입니다. 이때는 문자열 앞쪽의 공백을 제거하는 LTrim() 함수로 공백을 제거할 수 있습니다.

두번째 방법은 Format() 함수를 사용하는 것입니다. Format() 함수는 앞에 불필요한 공백을 붙이지 않아서 더 편리합니다.

숫자를 문자(문자열)로 변환 예제


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
Sub Number_To_String_Example()

  Dim s

  s = Str(123)       ' 숫자를 문자열로 변환
  s = "[" & s & "]"  ' 공백 유무 체크 위해 괄호 붙임
  MsgBox s
  ' 출력 결과: [ 123]




  s = Str(123)       ' 숫자를 문자열로 변환
  s = LTrim(s)       ' 앞쪽의 공백 제거
  s = "[" & s & "]"  ' 공백 유무 체크 위해 괄호 붙임
  MsgBox s
  ' 출력 결과: [123]




  s = Format(123)    ' 숫자를 문자열로 변환
  s = "[" & s & "]"  ' 공백 유무 체크 위해 괄호 붙임
  MsgBox s
  ' 출력 결과: [123]

End Sub



Monday, January 22, 2007

C언어-VC] 파일 속성(읽기전용/히든 속성 등) 출력; Print File Attributes: ARHS

윈도우의 각 파일에는 대부분 속성이 있습니다. 다음과 같은 것입니다.

A : 기록 가능 (백업 속성)
R : 읽기 전용 속성
H : 숨김(히든) 속성
S : 시스템 속성

비주얼C에서 파일의 속성을 얻은 후 화면에, [ARHS] 이런 형식의 문자열로 출력하는 방법입니다.


Visual C에서, 파일 속성 출력 예제


소스 파일명: 0.cpp
(현재 디렉토리에 "Beatles, The - All My Loving.mp3" 이런 이름의 파일이 있다고 가정하고...)
#include <stdio.h>
#include <stdlib.h> // exit()
#include <io.h>
#include <errno.h>

char* attribToString(unsigned attrib);


int main(void) {
  _finddatai64_t c_file;
  intptr_t hFile;
  char* filename = "Beatles, The - All My Loving.mp3";


  if ( (hFile = _findfirsti64(filename, &c_file)) == -1L ) {
    switch (errno) {
      case ENOENT:
        printf(":: 파일이 없음 ::\n"); break;
      case EINVAL:
        fprintf(stderr, "Invalid path name.\n"); exit(1); break;
      case ENOMEM:
        fprintf(stderr, "Not enough memory or file name too long.\n"); exit(1); break;
      default:
        fprintf(stderr, "Unknown error.\n"); exit(1); break;
    }
  } // end if
  else {
    printf("[%s]\n", attribToString(c_file.attrib));
  } // end else

  _findclose(hFile);


  return 0;
}




char* attribToString(unsigned attrib) {
  static char s[4 + 1];

  (attrib & _A_ARCH  ) ? s[0] = 'A' : s[0] = ' ';
  (attrib & _A_RDONLY) ? s[1] = 'R' : s[1] = ' ';
  (attrib & _A_HIDDEN) ? s[2] = 'H' : s[2] = ' ';
  (attrib & _A_SYSTEM) ? s[3] = 'S' : s[3] = ' ';

  return s;
}



컴파일 및 실행 결과:
(현재 디렉토리의 "Beatles, The - All My Loving.mp3" 라는 파일이 "읽기 전용 속성"만을 가지고 있을 때)
D:\Z>cl /nologo 0.cpp && 0.exe
0.cpp
[ R  ]

D:\Z>



출력 결과 설명


파일의 속성을 변경해 주면 출력 결과도 달라집니다.

아무 속성도 없을 때:
[    ]

백업 속성 주었을 때:
[A   ]

백업+읽기전용 속성 주었을 때:
[AR  ]

백업+읽기전용+히든 속성 주었을 때:
[ARH ]

백업+읽기전용+히든+시스템 속성까지 모두 주면:
[ARHS]


이제, 읽기전용 속성을 제거하면
[A HS]

백업 속성 제거하면:
[  HS]


시스템 속성 제거하면:
[  H ]


모든 속성 지웠을 때:
[    ]



▶▶ C언어 VC] 파일 속성; 읽기 전용 여부 판단 함수; is File Readonly?

▶▶ C언어 VC] 숨김 속성, 히든 파일 여부 판단 함수; is File Hidden?

▶▶ 파일의 '기록 가능 속성 (Archive File Attribute)' / '보관 속성'이란 무엇입니까? [QnA]

▶▶ C언어] 파일 타임 스탬프, 파일 날짜 시간 구하기 함수; File Time Stamp, Last Write Date


DIR 명령 구현 소스: ▶▶ C언어 VC] 도스 DIR 명령 구현; 파일 목록(리스트) 출력; 와일드 카드(Wild Card) 지원


Excel/엑셀 VBA] 반각 문자/ 전각 문자 변환; Half-Width Full-Width Char Convert

반각 문자와 전각 문자를 상호 변환하는 방법입니다. 한글에서는 영문과 숫자를 모두 반각으로 사용하지만, 특수한 경우에는 가끔 전각을 쓸 때도 있습니다.

StrConv() 함수를 사용합니다.

반각을 전각으로, 전각을 반각으로 변경 예제


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
Sub Half_Full_Width_Example()

  Dim h, f

  ''''''''''''''''''''''''''''''''''''''''''''''''''''
  ' 알파벳과 기호/공백은 반각 문자 (1바이트)
  h = "AAA 국가 國家 !@#$%^&*()"


  ''''''''''''''''''''''''''''''''''''''''''''''''''''
  ' 모두 전각 문자 (2바이트) / 공백문자까지 전각임
  f = "AAA 국가 國家 !@#$%^&*()"




  ' 반각 문자를 전각 문자로 변환
  MsgBox StrConv(h, vbWide)
  ' 출력 결과: AAA 국가 國家 !@#$%^&*()



  ' 전각 문자를 반각 문자로 변환
  MsgBox StrConv(f, vbNarrow)
  ' 출력 결과: AAA 국가 國家 !@#$%^&*()

End Sub



한글이나 한자처럼 원래 2바이트(전각)일 수밖에 없는 문자는 변환되지 않고 항상 그대로입니다.


전각/반각 의미: ▶▶ 컴퓨터용어] 반각 문자 / 전각 문자;(半角/全角)의 의미, 차이점- Half-Width / Full-Width Character

전각 문자표: ▶▶ 전각 문자표] 전각 숫자, 전각 영문 알파벳 문자, 전각 기호 ; Full Width ASCII Characters; 2 Bytes

Excel/엑셀 VBA] 영문 알파벳 대소문자 변환, 문자열 대문자, 소문자로; Uppercase Lowercase

VBA매크로를 사용하여, 문자열에서, 영문 알파벳의 대소문자를 변경하는 방법입니다.

* 모두 대문자로 (Uppercase)

* 모두 소문자로 (Lowercase)

* 첫글자만 대문자로, 나머지는 소문자로 (Capitalize)

위의 3가지 방법이 있습니다. StrConv 함수를 사용합니다.


VBA로 알파벳 대소문자 변경 예제


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.
Sub Case_Conversion_Example()

  Dim s

  s = "AAA aaa Aaa"


  ' 알파벳을 모두 대문자로 변환
  MsgBox StrConv(s, vbUpperCase)
  ' 출력 결과: AAA AAA AAA



  ' 알파벳을 모두 소문자로 변환
  MsgBox StrConv(s, vbLowerCase)
  ' 출력 결과: aaa aaa aaa



  ' 각 단어의 첫글자만 대문자로
  MsgBox StrConv(s, vbProperCase)
  ' 출력 결과: Aaa Aaa Aaa

End Sub



VBA가 아닌, 엑셀 내장 함수로 대소문자 변경: ▶▶ Excel/엑셀] 영문 알파벳 대소문자 변환 함수, 첫글자만 대문자로; Uppercase, Lowercase, Capitalize


Java/자바] 문자열 배열 출력; Print String Array; Dump Array

배열을 Arrays.toString() 으로 출력하거나,

또는 dumpArray() 라는 메소드(함수)를 만들어서 좀더 자세히 출력하는 방법입니다. dumpArray() 는 배열의 내용을 직관적으로 보여주기에, 디버깅할 때 편리할 것입니다.


배열 출력 예제


소스 파일명: Foo.java
(※ 스크롤 박스 사용법: 박스 안을 마우스로 클릭한 후, 키보드의 좌우 화살표키를 누르면 양옆으로 움직일 수 있습니다. 박스에서 다시 나오려면, 박스 바깥의 아무곳이나 클릭하면 됩니다.)
import java.util.Arrays;  // Arrays.toString() 에 필요

class Foo {
  public static void main(String[] args) {

    String[] dishes = { "자장면", "탕수육", "팔보채", "불도장", "짬뽕" };


    // Arrays.toString() 으로 출력
    System.out.println(Arrays.toString(dishes));
    // 화면 출력 결과: [자장면, 탕수육, 팔보채, 불도장, 짬뽕]



    // dumpArray() 로 출력
    dumpArray(dishes);
    /* 화면 출력 결과:

      배열 요소 개수: 5
      [ 0] = '자장면'
      [ 1] = '탕수육'
      [ 2] = '팔보채'
      [ 3] = '불도장'
      [ 4] = '짬뽕'

   */


  }




  public static void dumpArray(String[] a) {
    System.out.println("배열 요소 개수: " + a.length);

    for (int i = 0; i < a.length; i++)
      System.out.format("[%2d] = '%s'%n", i, a[i]);
  }


}



▶▶ Java/자바] join 메소드: 배열을 하나의 문자열로 합치기, 구분문자 넣어

자바 강좌와 각종 예제

Java/자바] nextInt() 메소드 사용법

Random 클래스의 nextInt() 메소드에 파라미터를 입력하지 않으면 int형 표현 범위(-2147483648 ~ 2147483647)의 모든 영역에서 랜덤한 숫자가 나옵니다.

그런데 int형 파라미터를 입력하면, 0에서 그 파라미터 미만의 랜덤한 정수를 반환합니다.

예를 들어, nextInt(10) 이렇게 하면 0~9까지의 랜덤한 숫자가 나옵니다.


nextInt() 예제


소스 파일명: Foo.java
import java.util.Random;

class Foo {
  public static void main(String[] args) {

    Random rnd = new Random();



    // int형 모든 범위에서 랜덤하게
    int i = rnd.nextInt();
    System.out.println(i);
    /* 예를 들어 다음과 같이 출력
       1881711564
    */



    // 0 이상에서, 지정 숫자 미만의 범위
    int i2 = rnd.nextInt(10);
    System.out.println(i2);
    /* (10을 입력하면 0~9 까지 나옴)
       예를 들어 다음과 같이 출력
       5
    */


  }
}



▶▶ [자바/Java] 랜덤(난수) 정수/실수/불린 출력 예제 - Random, nextInt() 메소드

자바 강좌와 각종 예제

Java/자바] nextBytes() nextDouble() nextLong()

Random 클래스의 nextBytes() 메소드는, 랜덤한 바이트를 반환하는 것이 아니고, 바이트 배열(byte[])을 랜덤하게 채웁니다. (nextBytes 에서 Bytes 가 단수형이 아닌 복수형으로 되어 있음)

nextDouble() 은, 0.0 이상에서 1.0 미만의 랜덤한 64비트 실수를 반환하고

nextLong() 은 long형의 표현 범위 즉 -9223372036854775808 에서 9223372036854775807 까지의 임의의 long형 숫자를 반환합니다.


nextBytes() nextDouble() nextLong() 사용 예제


파일명: Foo.java
import java.util.Random;
import java.util.Arrays;

class Foo {
  public static void main(String[] args) {

    Random rnd = new Random();


    // 랜덤 바이트 배열 생성
    byte[] bt = new byte[10];
    rnd.nextBytes(bt);
    System.out.println(Arrays.toString(bt));
    /* 예를 들어 다음과 같이 출력
       [-111, 61, -16, -69, -76, 92, 38, 48, -118, -28]
    */




    // 64비트 실수형 랜덤 생성
    double d = rnd.nextDouble();
    System.out.println(d);
    /* 예를 들어 다음과 같이 출력
       0.6409592962605787
    */




    // 64비트 정수형 랜덤 생성
    long Lg = rnd.nextLong();
    System.out.println(Lg);
    /* 예를 들어 다음과 같이 출력
       -9105411250856399027
    */


  }
}


nextInt() / nextBoolean() 등의 사용: ▶▶ [자바/Java] 랜덤(난수) 정수/실수/불린 출력 예제 - Random, nextInt() 메소드


자바 강좌와 각종 예제

Sunday, January 21, 2007

리눅스에서 C 실행하는 방법. 유닉스 C컴파일러 실행 법; Linux Unix

리눅스의 프롬프트에서 gcc 라고 치면, C컴파일러가 실행됩니다.

gcc 0.c

라고 하면, 0.c 라는 C소스가 컴파일되어 a.out 이라는 실행파일이 만들어집니다.

유닉스에서는 cc 라고 하면 됩니다.


리눅스 배포본에 따라, gcc 가 설치되어 있지 않은 경우도 있습니다. 이때는 수동으로 설치해 주어야 합니다: ▶▶ 우분투.리눅스] gcc 설치하기/C컴파일러 설치법, Ubuntu Linux gcc Install


gcc 가 설치되어 있더라도, gcc 에 접근할 권한이 없으면 실행이 안됩니다. 이때는 루트로 로그인하든지 합니다: ▶▶ 우분투(Ubuntu)리눅스] 루트(root)계정으로 로그인하기, 루트 계정 만들기


gcc 로 간단한 C소스를 컴파일하는 예제: ▶▶ [C언어] 컴파일러 테스트용의 간단한 소스 코드: Hello World






<< Home

Categories
Some Recent Posts
Monthly Archives
Top