2008年3月29日土曜日

文字列のセンタリング

どう書く?orgより。
文字列の長さに応じて、ifで分岐しています。もっとスマートに記述できないものでしょうか?

/*
    どう書く?org より
        文字列のセンタリング
        http://ja.doukaku.org/87/
*/


#runtime "hsp3cl"
#module
#defcfunc spaces int len
    if len <= 0 : return ""

    sdim s, len + 1
    repeat len
        poke s, cnt' '
    loop
    return s

#defcfunc centered_text str target, int len
    if len <= 0 : return ""

    target_length = strlen(target)
    result = target
    if target_length < len {
        result = spaces((len - target_length)/2) + target + spaces((len - target_length + 1)/2)
    } else : if target_length > len {
        result = strmid(result, (target_length - len)/2, len)
    }
    return result
#global

    s = "*"
    repeat 10
        mes centered_text(s, 15)
        s += " *"
    loop
    stop


追記。
ifによる条件分岐をlimit関数に置き換えました。

/*
    どう書く?org より
        文字列のセンタリング
        http://ja.doukaku.org/87/
*/

#runtime "hsp3cl"

#module
#defcfunc centered_text str _source, int len
    if len <= 0 : return ""
    source = _source

    source_strlen = strlen(source)
    sdim result, len + 1
    memset result, ' ', len
    poke result, limit((len - source_strlen)/20, len/2), strmid(source, limit((source_strlen - len)/20, source_strlen), len)
    return result
#global

    s = "*"
    repeat 10
        mes centered_text(s, 15)
        s += " *"
    loop
    stop

2008年3月18日火曜日

HSP入門者向け講座リンク集 更新

クロノス・クラウンにてHSP入門者向け講座リンク集が更新されました。HSP関連サイトを横断的に検索できるサービスも追加されています。

なお、当ブログは難易度中~高と評価されています。

関連

2008年3月6日木曜日

はてなスターを設置しました

動作確認用のテスト投稿です。

2008年3月1日土曜日

日数計算・曜日計算

COMを利用した、日付を扱うモジュールです。

指定した日の曜日を算出する関数と、指定した2つの日の差(日数)を算出する関数を含んでいます。
日数算出は「あと何日あるか」を算出するので、このサンプルプログラムのように「全部で何日か」を計算する場合は1を足す必要があります。

/*
    日付を扱うライブラリになりそうなもの。
    ※ 注意!パラメータチェック&エラーチェック処理未実装!

    参考:http://tsu.sakura.ne.jp/article/note/eid512.html
*/


#module
// ミリ秒を日に変換
#define ctype cnvMsec2Day(%1int((%1)/86400000)  // 86400000 = 1000*60*60*24
// javascript数式の計算
#defcfunc jsEval str jsExp
    if vartype(mssc) != vartype("comobj") {
        newcom mssc, "MSScriptControl.ScriptControl"
        comres result
        mssc("Language") = "JScript"
    }
    mssc -> "Eval" jsExp
    return result
// 曜日を返す(0~6)
#defcfunc getDayOf int y, int m, int d
    return int(jsEval("(new Date(" + y + "," + (m - 1) + "," + d + ")).getDay();"))
// 時間差を日数で返す
#defcfunc getSub int y1, int m1, int d1, int y2, int m2, int d2
    return cnvMsec2Day(jsEval("Date.UTC(" + y2 + "," + (m2 - 1) + "," + d2 + ") - Date.UTC(" + y1 + "," + (m1 - 1) + "," + d1 + ");"))
#global

// モジュールここまで
    day = "日""月""火""水""木""金""土"
    mes "今年は" + (1 + getSubgettime(0), 11gettime(0), 1231 )) + "日間です"
    mes "今日は" + day( getDayOfgettime(0), gettime(1), gettime(3) ) ) + "曜日です"
    stop