logo

한국어

지식나눔

한국아마추어천문학회 한국천문연구원 회원가입안내



  • 398
  • 1921398
컴퓨터천문학
2010.10.19 19:10

[컴퓨터 천문학] 03.MINSEC 함수(3)

댓글 0 조회 수 9045 추천 수 0
?

단축키

이전 문서

다음 문서

+ - Up Down Comment Print Files
?

단축키

이전 문서

다음 문서

+ - Up Down Comment Print Files

이 글은 독일우주운영센터(GSOC)의 과학자인 Oliver Montenbruck와 Thomas Pfleger가 공동 출판한 Astronomy with your Personal Computer를 의역 후,  작성된 것임을 알리며, 원저의 베이직 코드를 웹 환경에서 쉽게 실행해 볼 수 있도록 자바스크립트 코드로 변경하여 작성하였음을 밝힙니다. 자바스크립트 코드와 이 글의 내용은 글쓴이의 2차 저작물 이므로 배포나 내용의 임의 변경에 대해 글쓴이의 동의가 있어야 합니다.

 

이번엔 마지막으로 지난 앞에 작성된 모듈 2가지를 조합하여 결과를 출력해 보겠습니다.


먼저 기본적인 흐름은 다음과 같습니다.


1. "숫자값 그리고 분과 초의 변환을 수행하시겠습니까?" 라는 질문에 Y / N 형태로 입력한다.

20101019_01.JPG

 

2. Y라면 "숫자형태의 각/시간 값을 입력하세요" 라는 질문을 던진다.

3. 2번 질문에 대한 답변으로 Y가 입력되면 질문옆에 표시된 예시와 같은 형태의 값을 입력한다.

20101019_02.JPG

 

4. 결과 값을 확인한다.

20101019_03.JPG

 

5. 이번에는 각/시간, 분, 초의 값을 입력하라는 질문에 대해 Y/N 형태로 답변하고, 각/시간 값을 입력한다.

20101019_04.JPG

 

6. 그리고 이것에 대한 결과값을 확인한다.

20101019_05.JPG


입력값과 결과값은 아래의 그림처럼 팝업창이 닫히면 웹 브라우저 화면에 표시하게 됩니다.


20101019_06.JPG


 

이제 이 프로그램에 대한 전체 코드에 대한 설명입니다.

 /**************************************************
YESNO함수
***************************************************/


/*

이 함수는 입력이 Y인지 N인지에 따라 E라는 변수에 1을 설정합니다. 이 변수값은 어떤 형태로 변환을 시도할 것인지를 결정하는 값입니다.

*/

YESNO = function(q)
{
    var p = q;   //YESNO 함수에 전달된 값을 변수 p에 할당한다.
    var E;

 

   //p 변수에 저장된 값이 소문자 또는 대문자 일수 있기 때문에 대문자로 변환하여 값을 비교한다.

    if ( (p.toUpperCase() == "Y") ) {
        E = 1
    }

   //값이 Y면 변수 E는 1 아니면 0을 할당한다.

   else if ( (p.toUpperCase() == "N") ) {
        E = 0
    }

    //Y나 N값이 아니면 적절한 문구를 표시하여 값 입력을 유도한다.

    else {
        var a = prompt("Y와 N으로 입력하셔야 합니다.");
        YESNO(a);
    }
    return E;
}

/**************************************************
MINSEC 함수
***************************************************/
//숫자 입력값에 대해 양수인지 음수인지를 체크하여 적절한 부호를 리턴하는 함수

Sgn = function (x) {
    if (x < 0) return -1;
    else if (x > 1) return 1;
    else return 0;
    }


/* 이 함수는 입력된 값의 형태를 인지하여 적절한 값으로 변환을 시도합니다. */
MINSEC = function(X) {
    var SW;   //스위치변수
    var SN = 1;    //로직분기(숫자값 변환인지, 시간값 변환인지...)
    var XP;    //보정함수가 포함된 변환값
    var XD;   //숫자 입력값 X에 대한 시간 변환값을 저장
    var A;
    var X;    //숫자 입력값 또는 시간/각 값
    var XM;    //숫자 입력값 X에 대한 분 변환값을 저장
    var XS;    //숫자 입력값 X에 대한 초 변환값을 저장
    var returnValue;    //사용자에게 결과값을 보여주기 위한 값을 저장
    var strS = "";    //문자열 변수
    var getX = X.split(',');    //시, 분, 초로 입력된 값을 콤마(,)를 기준으로 분리하여 저장(분리하면 배열로 저장됨)

    //전달된 X변수의 길이를 이용한 SW 설정

   //전달된 값의 길이가 0이면 시간값이고 0이 아니면 각/시간, 분, 초의 형태로 입력된 값이다.

   //0이면 SW에 1을 할당하여 해당 조건을 실행하고, 0이 아니면 SW에 -1을 할당하여 해당 조건을 실행합니다.

    if (getX.length -1 == 0) {
        SW = 1;
    } else {
        SW = -1;
    }

    //스위치값에 따른 분기

    //SW 가 -1인 조건은 입력값의 형태가 12,3,4와 같은 각/시간, 분, 초의 형태이므로 값을 숫자값 형태로 변환을

    //하게 됩니다. 하지만 입력된 3개의 값이 마이너스의 형태를 띌수도 있기 때문에 마이너스인지의 여부를 확인하여

    //적절한 기호를 붙여 줍니다.

    if(SW == -1) {

        //분리함수에 의해 저장된 값이 0보다 작을 경우 음수 기호를 붙여준다.
        if((parseInt(getX[0]) < 0) || (parseInt(getX[1]) < 0) || (parseInt(getX[2]) < 0)) {
            strS = "-";
            SN = -1;
        }
        

        //배열에 저장된 값을 숫자로 변환하여 초, 분, 시 함수에 저장
        XS = parseInt(getX[2]);
        XM = parseInt(getX[1]);
        XD = parseInt(getX[0]);

       //공식을 이용하여 X 숫자값으로 변환
        X = ( ( Math.abs(XS)/60 ) + ( Math.abs(XM)/60 ) + Math.abs(XD) ) * SN;

        returnValue = X;
    }

    //숫자값 형태가 입력되었다면 각/시간, 분, 초의 형태로 변환을 시도 합니다.
    if(SW == 1) {
        SN = Sgn(X);    //X 숫자값을 Sgn()함수에 전달하여 양수인지 음수인지 판단.
        XP = Math.abs(X) + 1.39E-6;    //변환시 필요한 보정 함수를 이용하여 값을 생성

        XD = parseInt(XP);     //시간
        A = (XP-XD) * 60;
        XM = parseInt(A);    //분
        XS = parseInt( (A-XM) * 6000 ) /100.0;    //초
        //분기값이 -1 이라면 문자열로 음수 기호를 만들어주고

        if(SN == -1) {
            strS = "-";

 

            //시 또는 분 또는 초의 값이 음수라면 해당값 앞에 음수 기호를 붙여준다.
            if(XD == 0) {
                strS = XD + "시" + "-" + XM + "분" + XS + "초";
            } else if (XM == 0) {
                strS = XD + "시" +XM + "분" + "-" + XS + "초";
            } else {
                strS = "-" + XD + "시" +XM + "분" + XS + "초";
            }
        } else {
            strS = XD + "시" + XM + "분" + XS + "초";
        }
        returnValue = strS;
    }

    return returnValue;
}


//사용자가 입력하는 값을 각각의 함수에 전달하는 Start 함수 입니다.
HMINSEC = function() {

    var getminsec;
    var print = "숫자값, 분과 초 변환 폼 입니다." + "<br>";
    print = print + "---------------------------------" + "<br>";

    //숫자값을 입력하겠냐는 질문이고 값이 입력되면 변수 q(Question)에 저장된다.
    var q = prompt("숫자값 그리고 분과 초의 변환을 수행하시겠습니까? ( Y or N )");

    print = print + "숫자값 그리고 분과 초의 변환을 수행하시겠습니까? ( Y or N )에 대한 답: " +q + "<br>";

    // YESNO 함수에 입력값을 전달하고 1 또는 0의 값을 반환 받는다.
    var E = YESNO(q);

 

    //반환값이 1이라면
    if ( E == 1 ) {
        q = prompt("숫자형태의 각/시간 값을 입력하세요. 예: 1.616667");
        getminsec = MINSEC(q);     //MINSEC()함수에 입력값 q를 전달한다.
        print = print + "입력된 값에 대한 시간 변환값은 " + getminsec + " 입니다.<br><br>";
        alert("변환값은: " + getminsec + " 입니다.");

       //이어서 시, 분, 초를 입력받아 MINSEC 함수에 전달
        q = prompt("각/시간, 분, 초의 값을 입력하세요. 예: 137, 21, 8.2");
        getminsec = MINSEC(q);
        print = print + "각/시간, 분, 초의 값을 입력하세요에 대한 답: " + q + "<br>";
        print = print + "입력값에 대한 변환값은 " + getminsec +" 입니다.";
        alert("변환값은: " + getminsec + " 입니다.");
    }

 

    //YESNO 함수에서 전달된 값이 0이라면 다시 입력을 요구.
    if( E == 0 ) {
        q = prompt("다시 입력하세요.( Y or N )");
        E = YESNO(q);
    }

    //질문에 답한 값과 결과값을 문서의 본문에 표현하기 위한 값
    document.getElementById("msgPrint").innerHTML = print;
    }

HMINSEC();    //함수를 시작합니다.


조금 복잡하지만 첨부한 파일(Normal1.html)을 다운로드 받아서 실행해 보면 감이 좀 잡힐 것으로 생각됩니다.

여기까지 해서 천문학 프로그래밍에 필요한 가장 기본적인 함수를 작성해 보았습니다.


실행할 파일은 Noname1.html 이며, 클릭 후 스크립트 오류가 발생한다면 이것은 브라우저의 보안 기능이 작동하여 스크립트의 실행을 차단하기 때문입니다. 이 예제는 바이러스를 퍼트리거나 개인정보를 취득하기 위한 스크립트가 없습니다.

(스크립트 실행 경고창은 가끔 바보 스럽습니다.)

따라서 결과가 보이지 않는 분들은 도구 > 인터넷옵션 으로 이동 후 보안 탭에서 실행할 보안 수준을 보통으로 낮춘 후 실행하시면 됩니다.


Computer Astrology

번호 제목 글쓴이 날짜 조회 수
20 Optical SETI (1) [1]  image [레벨:12]박종현 부지부장 2019.03.16 373
19 [SETI] 10. 성간 전파 프로젝트와 페이퍼 프로젝트 [1]  fileimage [레벨:12]박종현 정보부장 2011.11.10 16721
18 [SETI] 9. SETI Net [1]  fileimage [레벨:12]박종현 정보부장 2011.11.09 11555
17 [SETI] 8. Allen Telescope Array [1]  fileimage [레벨:12]박종현 정보부장 2011.11.08 11943
16 [SETI] 7. SETI@home [2]  image [레벨:12]박종현 정보부장 2011.11.07 12158
15 [SETI] 6. The SETI League and Project Argus [1]  image [레벨:12]박종현 정보부장 2011.11.01 12006
14 [SETI] 5. MOP and Project Phoenix [2] [1]  fileimage [레벨:4]정보부차장(유환용) 2011.07.13 10489
13 [SETI] 4. Sentinel, META, and BETA  image [레벨:12]박종현 2011.06.16 9972
12 [SETI] 3. Early work [1]  image [레벨:12]박종현 2011.06.15 9026
11 [SETI] 2. Radio experiments [1]  image [레벨:12]박종현 2011.06.15 8917
10 [SETI] 1. SETI [1]   [레벨:12]박종현 2011.06.15 11510
9 [컴퓨터 천문학] 05. julian day를 CALDAY로(1) [1]   [레벨:12]박종현 2011.04.25 10295
8 [컴퓨터 천문학] 04. 1900년 1월 0.5 이후 달력날짜를 율리우스 ... [1]  file [레벨:12]박종현 2010.11.04 9265
7 [컴퓨터 천문학] 04. 1900년 1월 0.5 이후 달력날짜를 율리우스 ...  image [레벨:12]박종현 2010.11.04 13289
» [컴퓨터 천문학] 03.MINSEC 함수(3) [1]  fileimage [레벨:12]박종현 2010.10.19 9045
5 [컴퓨터 천문학] 03.MINSEC 함수(2) [1]   [레벨:12]박종현 2010.10.13 8661
4 [컴퓨터 천문학] 03.MINSEC 함수(1)   [레벨:12]박종현 2010.10.13 8964
3 [컴퓨터 천문학] 02. YESNO 함수 작성 [1]  fileimage [레벨:12]박종현 2010.10.07 8624
2 [컴퓨터 천문학] 01. DEFAULT 함수 [6]  fileimage [레벨:12]박종현 2010.10.07 9409
1 컴퓨터 천문학 [2] [1]   [레벨:12]박종현 2010.10.05 34797
Board Pagination ‹ Prev 1 Next ›
/ 1
Designed by hikaru100

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

SketchBook5,스케치북5

SketchBook5,스케치북5

SketchBook5,스케치북5

SketchBook5,스케치북5