どう書く?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)/2, 0, len/2), strmid(source, limit((source_strlen - len)/2, 0, source_strlen), len)
    return result
#global
    s = "*"
    repeat 10
        mes centered_text(s, 15)
        s += " *"
    loop
    stop
2008年3月29日土曜日
文字列のセンタリング
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(%1) int((%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 + getSub( gettime(0), 1, 1, gettime(0), 12, 31 )) + "日間です"
    mes "今日は" + day( getDayOf( gettime(0), gettime(1), gettime(3) ) ) + "曜日です"
    stop