Contents
- 構文
- REPLACE( 文字列, 置換したい文字, 置換文字 )
- 引数
- 文字列
- 置換したい文字列を含んだ文字列
- 置換したい文字
- 置換したい文字列
- 置換文字
- 置換文字列
- 戻値
置換された文字列
(大文字,小文字の区別はしません)
自作関数
- Hour
- シリアル値から「時」を求めます。
- Minute
- シリアル値から「分」を求めます。
- Second
- シリアル値から「秒」を求めます。
- getEndOfMonth
- dateで指定された月の月末日を取得します。
- dateAdd
- 日時に、指定した単位の時間を加算して返します。
プログラム実行例
総段落数を取得
CONST wdDoNotSaveChanges = 0
CONST wdSaveChanges = -1
DIM arr[-1]
FOR n = 0 TO GETALLWIN() - 1
arrayPush(arr, ALL_WIN_ID[n])
NEXT
arrayFilter(arr, "STATUS(%val%, ST_CLASS) = <#DBL>OpusApp<#DBL> AND STATUS(%val%, ST_VISIBLE)")
arrayMap("REPLACE(STATUS(%val%, ST_TITLE), <#DBL> - Microsoft Word<#DBL>, <#DBL><#DBL>)", arr)
QSORT(arr, QSRT_A)
TRY
DIM Word = GETACTIVEOLEOBJ("Word.Application")
EXCEPT
MSGBOX("操作する文書を開いてださい。")
EXIT
ENDTRY
DIM res = SLCTBOX(SLCT_RDO OR SLCT_STR, 0, "操作する文書を選択", arr)
IFB res = -1 THEN
MSGBOX("ファイル名が選択されなかったので終了します。")
EXIT
ENDIF
Word.Documents(res).Activate
PRINT Word.ActiveDocument.Paragraphs.Count
//////////////////////////////////////////////////
// 【引数】
// array : 一次元配列
// callback : コールバック関数。callback内で配列の値は「%val%」で使うことができます。
// 【戻値】
// callback関数によりフィルタ処理が行われた arrayの全ての要素を含む配列を返します。
//////////////////////////////////////////////////
PROCEDURE arrayFilter(var array[], callback)
DIM n = 0
DIM tmp[-1]
FOR %val% IN array
IFB EVAL(callback) THEN
RESIZE(tmp, n)
tmp[n] = %val%
n = n + 1
ENDIF
NEXT
RESIZE(array, RESIZE(tmp))
FOR n = 0 TO RESIZE(tmp)
array[n] = tmp[n]
NEXT
FEND
//////////////////////////////////////////////////
// 【引数】
// callback : 配列の各要素に適用するコールバック関数
// array : コールバック関数を適用する配列
// 【戻値】
// callback関数を適用した後、 適用後の要素を含む配列
//////////////////////////////////////////////////
PROCEDURE arrayMap(callback, var array[])
DIM tmp[RESIZE(array)]
DIM n = 0
FOR %val% IN array
tmp[n] = EVAL(callback)
n = n + 1
NEXT
RESIZE(array, RESIZE(tmp))
FOR n = 0 TO RESIZE(tmp)
array[n] = tmp[n]
NEXT
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 要素を追加する配列(参照引数)
// str : 追加する要素
// 【戻値】
// 処理後の配列の中の要素の数
//////////////////////////////////////////////////
FUNCTION arrayPush(var arr[], str)
DIM res = RESIZE(arr, UBound(arr) + 1)
arr[res] = str
RESULT = res + 1
FEND
//////////////////////////////////////////////////
// 【引数】
// 配列 : 上限値を求める配列
// 【戻値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(array[])
RESULT = RESIZE(array)
FEND
カーソル位置の文章を取得
DIM arr[-1]
FOR n = 0 TO GETALLWIN() - 1
arrayPush(arr, ALL_WIN_ID[n])
NEXT
arrayFilter(arr, "STATUS(%val%, ST_CLASS) = <#DBL>OpusApp<#DBL> AND STATUS(%val%, ST_VISIBLE)")
arrayMap("REPLACE(STATUS(%val%, ST_TITLE), <#DBL> - Microsoft Word<#DBL>, <#DBL><#DBL>)", arr)
QSORT(arr, QSRT_A)
TRY
DIM Word = GETACTIVEOLEOBJ("Word.Application")
EXCEPT
MSGBOX("操作する文書を開いてださい。")
EXIT
ENDTRY
DIM res = SLCTBOX(SLCT_RDO OR SLCT_STR, 0, "操作する文書を選択", arr)
IFB res = -1 THEN
MSGBOX("ファイル名が選択されなかったので終了します。")
EXIT
ENDIF
PRINT Word.Selection.Sentences(1).Text
//////////////////////////////////////////////////
// 【引数】
// array : 一次元配列
// callback : コールバック関数。callback内で配列の値は「%val%」で使うことができます。
// 【戻値】
// callback関数によりフィルタ処理が行われた arrayの全ての要素を含む配列を返します。
//////////////////////////////////////////////////
PROCEDURE arrayFilter(var array[], callback)
DIM n = 0
DIM tmp[-1]
FOR %val% IN array
IFB EVAL(callback) THEN
RESIZE(tmp, n)
tmp[n] = %val%
n = n + 1
ENDIF
NEXT
RESIZE(array, RESIZE(tmp))
FOR n = 0 TO RESIZE(tmp)
array[n] = tmp[n]
NEXT
FEND
//////////////////////////////////////////////////
// 【引数】
// callback : 配列の各要素に適用するコールバック関数
// array : コールバック関数を適用する配列
// 【戻値】
// callback関数を適用した後、 適用後の要素を含む配列
//////////////////////////////////////////////////
PROCEDURE arrayMap(callback, var array[])
DIM tmp[RESIZE(array)]
DIM n = 0
FOR %val% IN array
tmp[n] = EVAL(callback)
n = n + 1
NEXT
RESIZE(array, RESIZE(tmp))
FOR n = 0 TO RESIZE(tmp)
array[n] = tmp[n]
NEXT
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 要素を追加する配列(参照引数)
// str : 追加する要素
// 【戻値】
// 処理後の配列の中の要素の数
//////////////////////////////////////////////////
FUNCTION arrayPush(var arr[], str)
DIM res = RESIZE(arr, UBound(arr) + 1)
arr[res] = str
RESULT = res + 1
FEND
//////////////////////////////////////////////////
// 【引数】
// 配列 : 上限値を求める配列
// 【戻値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(array[])
RESULT = RESIZE(array)
FEND
カーソル位置の段落番号を取得
DIM arr[-1]
FOR n = 0 TO GETALLWIN() - 1
arrayPush(arr, ALL_WIN_ID[n])
NEXT
arrayFilter(arr, "STATUS(%val%, ST_CLASS) = <#DBL>OpusApp<#DBL> AND STATUS(%val%, ST_VISIBLE)")
arrayMap("REPLACE(STATUS(%val%, ST_TITLE), <#DBL> - Microsoft Word<#DBL>, <#DBL><#DBL>)", arr)
QSORT(arr, QSRT_A)
TRY
DIM Word = GETACTIVEOLEOBJ("Word.Application")
EXCEPT
MSGBOX("操作する文書を開いてださい。")
EXIT
ENDTRY
DIM res = SLCTBOX(SLCT_RDO OR SLCT_STR, 0, "操作する文書を選択", arr)
IFB res = -1 THEN
MSGBOX("ファイル名が選択されなかったので終了します。")
EXIT
ENDIF
DIM Range = Word.Selection.Range
Range.Start = 0
PRINT Range.Paragraphs.Count
//////////////////////////////////////////////////
// 【引数】
// array : 一次元配列
// callback : コールバック関数。callback内で配列の値は「%val%」で使うことができます。
// 【戻値】
// callback関数によりフィルタ処理が行われた arrayの全ての要素を含む配列を返します。
//////////////////////////////////////////////////
PROCEDURE arrayFilter(var array[], callback)
DIM n = 0
DIM tmp[-1]
FOR %val% IN array
IFB EVAL(callback) THEN
RESIZE(tmp, n)
tmp[n] = %val%
n = n + 1
ENDIF
NEXT
RESIZE(array, RESIZE(tmp))
FOR n = 0 TO RESIZE(tmp)
array[n] = tmp[n]
NEXT
FEND
//////////////////////////////////////////////////
// 【引数】
// callback : 配列の各要素に適用するコールバック関数
// array : コールバック関数を適用する配列
// 【戻値】
// callback関数を適用した後、 適用後の要素を含む配列
//////////////////////////////////////////////////
PROCEDURE arrayMap(callback, var array[])
DIM tmp[RESIZE(array)]
DIM n = 0
FOR %val% IN array
tmp[n] = EVAL(callback)
n = n + 1
NEXT
RESIZE(array, RESIZE(tmp))
FOR n = 0 TO RESIZE(tmp)
array[n] = tmp[n]
NEXT
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 要素を追加する配列(参照引数)
// str : 追加する要素
// 【戻値】
// 処理後の配列の中の要素の数
//////////////////////////////////////////////////
FUNCTION arrayPush(var arr[], str)
DIM res = RESIZE(arr, UBound(arr) + 1)
arr[res] = str
RESULT = res + 1
FEND
//////////////////////////////////////////////////
// 【引数】
// 配列 : 上限値を求める配列
// 【戻値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(array[])
RESULT = RESIZE(array)
FEND
Firefoxのバージョンを取得する
PRINT REPLACE(DOSCMD("<#DBL>C:\Program Files\Mozilla Firefox\firefox.exe<#DBL> -v | more"), "Mozilla Firefox ", "")
- 結果
- 77.0.1
数値の0埋め(ゼロパディング)をする
FORMAT関数で数値の左側をスペースで補完し、そのスペースを「0」に置換することで0埋めをしています。
DIM num = 256
PRINT REPLACE(FORMAT(num, 5), " ", "0")
- 結果
- 00256
二次方程式を解く
二次方程式
\[ax^{2}+bx+c=0 \hspace{10pt}(a \neq 0)\]解の公式
\[x=\frac{-b \pm \sqrt{b^2-4ac}}{2a}\]を用いて二次方程式を解きます。
判別式
\[D=b^{2}-4ac\]整数・小数にしか対応していません。
\[ax^{2}+bx+c=0\] 両辺を\(a\)で割る \[x^{2}+\frac{b}{a}x+\frac{c}{a}=0\] \(+\frac{c}{a}を移項する\) \[x^{2}+\frac{b}{a}x=-\frac{c}{a}\] 左辺を平方完成するために、両辺に\((\frac{b}{2a})^{2}を加える。\) \[\left(x+\frac{b}{2a}\right)^{2}=-\frac{c}{a}+\frac{b^{2}}{4a^{2}}\] \[=\frac{b^{2}-4ac}{4a^{2}}\] \[x+\frac{b}{2a}=\pm \frac{\sqrt{b^{2}-4ac}}{2a}\] \[x=\frac{-b\pm\sqrt{b^{2}-4ac}}{2a}\]DIM frac[2]
DIM coeff = SPLIT(INPUT("係数を入力してください。「ax^2+bx+c=0」の「a,b,c」を入力。"), ",")
DIM a = coeff[0]
DIM b = coeff[1]
DIM c = coeff[2]
// 判別式
DIM D = EVAL("POWER(b, 2) - 4 * a * c")
DIM ans[-1]
DIM digit = -3
SELECT TRUE
CASE D > 0
IFB b = 0 THEN
DIM root = simplifySqrt(D)
frac[0] = root[0]
frac[1] = EVAL("2 * a")
num = GCD(frac)
IFB frac[1] = ABS(num) THEN
res = frac[0] / ABS(num)
ELSE
res = frac[0] + "/" + frac[1]
ENDIF
arrayPush(ans, (IIF(frac[0] / num <> 1, frac[0] / num, "") + IIF(root[1] <> 1, "√(" + root[1] + ")", "")))
arrayPush(ans, (IIF(frac[0] / num <> 1, -frac[0] / num, "") + IIF(root[1] <> 1, "√(" + root[1] + ")", "")))
ELSE
// 約分する
frac[0] = EVAL("-b")
frac[1] = EVAL("2 * a")
num = GCD(frac)
IFB frac[1] = ABS(num) THEN
res = frac[0] / ABS(num)
ELSE
res = frac[0] + "/" + frac[1]
ENDIF
// ルートの中から整数を外に出す
root = simplifySqrt(D)
frac[0] = root[0]
num = GCD(frac)
IFB frac[1] = num THEN
arrayPush(ans, res + "+" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")"))
arrayPush(ans, res + "-" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")"))
ELSE
arrayPush(ans, res + "+(" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + "))/" + (frac[1] / num)))
arrayPush(ans, res + "-(" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + "))/" + (frac[1] / num)))
ENDIF
ENDIF
CASE D = 0
arrayPush(ans, ROUND(EVAL("-b/(2*a)"), digit))
CASE D < 0
IFB b = 0 THEN
root = simplifySqrt(D)
frac[0] = root[0]
frac[1] = EVAL("2 * a")
num = GCD(frac)
IFB frac[1] = ABS(num) THEN
res = frac[0] / ABS(num)
ELSE
res = frac[0] + "/" + frac[1]
ENDIF
arrayPush(ans, (IIF(frac[0] / num <> 1, frac[0] / num, "") + IIF(root[1] <> 1, "√(" + root[1] + ")", "")))
arrayPush(ans, (IIF(frac[0] / num <> 1, -frac[0] / num, "") + IIF(root[1] <> 1, "√(" + root[1] + ")", "")))
ELSE
frac[0] = EVAL("-b")
frac[1] = EVAL("2 * a")
num = GCD(frac)
IFB frac[1] = ABS(num) THEN
res = frac[0] / ABS(num)
ELSE
res = IIF(frac[0] * frac[1] < 0, "-", "") + ABS(frac[0] / num) + "/" + ABS(frac[1] / num)
ENDIF
// ルートの中から整数を外に出す
root = simplifySqrt(ABS(D))
frac[0] = root[0]
num = GCD(frac)
IFB frac[1] = num THEN
arrayPush(ans, res + "+" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")i"))
arrayPush(ans, res + "-" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")i"))
ELSE
arrayPush(ans, res + "+(" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")i)/" + (frac[1] / num)))
arrayPush(ans, res + "-(" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")i)/" + (frac[1] / num)))
ENDIF
ENDIF
SELEND
PRINT REPLACE(IIF(a <> 1, a, "") +"x^2+" + b + "x+" + c, "+-", "-")
PRINT "-----"
FOR item IN ans
PRINT item
NEXT
//////////////////////////////////////////////////
// 【引数】
// num : ルートの中
// 【戻値】
// 整数を外に出す
//////////////////////////////////////////////////
FUNCTION simplifySqrt(num)
HASHTBL root
DIM arr = primeFactorization(num)
DIM a = 1, b = 1
FOR item IN arr
root[item] = root[item] + 1
NEXT
FOR n = 0 TO LENGTH(root) - 1
IF INT(root[n, HASH_VAL] / 2) <> 0 THEN a = a * POWER(root[n, HASH_KEY], INT(root[n, HASH_VAL] / 2))
IF (root[n, HASH_KEY] * (root[n, HASH_VAL] MOD 2)) <> 0 THEN b = b * (root[n, HASH_KEY] * (root[n, HASH_VAL] MOD 2))
NEXT
DIM res[1] = a, b
RESULT = SLICE(res)
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 要素を追加する配列(参照引数)
// str : 追加する要素
// 【戻値】
// 処理後の配列の中の要素の数
//////////////////////////////////////////////////
FUNCTION arrayPush(var arr[], str)
DIM res = RESIZE(arr, UBound(arr) + 1)
arr[res] = str
RESULT = res + 1
FEND
//////////////////////////////////////////////////
// 【引数】
// arr : 最大公約数を求める数値を格納した配列
// 【戻値】
// 最大公約数
//////////////////////////////////////////////////
FUNCTION GCD(arr[])
DIM c = LENGTH(arr)
DIM rem = arr[c-1] MOD arr[c-2]
IFB rem = 0 THEN
IFB LENGTH(arr) = 2 THEN
RESULT = arr[c-2]
EXIT
ENDIF
RESIZE(arr, c-2)
RESULT = GCD(arr)
EXIT
ENDIF
arr[c-1] = arr[c-2]
arr[c-2] = rem
RESULT = GCD(arr)
FEND
//////////////////////////////////////////////////
// 【引数】
// expr : 評価する式
// truepart : 評価した式がTrueのときに返す値
// falsepart : 評価した式がFalseのときに返す値
// 【戻値】
// truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
IFB EVAL(expr) THEN
RESULT = truepart
ELSE
RESULT = falsepart
ENDIF
FEND
//////////////////////////////////////////////////
// 【引数】
// num : 素因数分解する数値
// 【戻値】
// 素因数分解した数値を格納した配列
//////////////////////////////////////////////////
FUNCTION primeFactorization(num)
DIM arr[-1]
// 偶数なら2で割り続ける
WHILE num MOD 2 = 0
arrayPush(arr, 2)
num = num / 2
WEND
FOR n = 3 TO num
WHILE num MOD n = 0
arrayPush(arr, n)
num = num / n
WEND
NEXT
RESULT = SLICE(arr)
FEND
//////////////////////////////////////////////////
// 【引数】
// 配列 : 上限値を求める配列
// 【戻値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(array[])
RESULT = RESIZE(array)
FEND
- 結果
- 4x^2+5x+3
-----
-5/8+(√(23)i)/8
-5/8-(√(23)i)/8