SPLIT

タグ:

SPlIT関数は、文字列を指定した区切文字列で区切り配列を返す関数です。

配列を結合し文字列にするには、JOIN関数を使います。

構文
SPLIT( 文字列, [区切文字列, 空文字処理フラグ, 数値処理フラグ] )
引数
文字列
区切り文字列を含んだ文字列
区切文字列
区切る為の文字列(省略時はスペース)
空文字処理フラグ
FALSE
空文字も有効(デフォルト)
TRUE
空文字は無効として処理しない
数値処理フラグ
FALSE
数値以外も有効 (デフォルト)
TRUE
数値型にて格納、数値以外は無効として空文字に変更する
戻値
作成された一次元配列(SAFEARRAY型) 

プログラム実行例

無線LANのインターフェイス情報を取得

HASHTBL LAN str = SPLIT(DOSCMD("netsh wlan show interface"), "<#CR>") FOR n = 0 TO UBound(str) IFB POS(":", str[n]) THEN arr = SPLIT(str[n], ":") LAN[TRIM(arr[0])] = TRIM(arr[1]) ENDIF NEXT DIM items[] = "名前", "説明", "GUID", "物理アドレス", "状態", + _ "SSID", "BSSID", "ネットワークの種類", "無線の種類", "認証", + _ "暗号", "接続モード", "チャネル", "受信速度 (Mbps)", "送信速度 (Mbps)", + _ "シグナル", "プロファイル", "ホストされたネットワークの状態" FOR item IN items PRINT item + ":" + LAN[item] NEXT ////////////////////////////////////////////////// // 【引数】 // 配列 : 上限値を求める配列 // 【戻値】 // 配列の上限値 ////////////////////////////////////////////////// FUNCTION UBound(array[]) RESULT = RESIZE(array) FEND
結果
名前:ワイヤレス ネットワーク接続
説明:Intel(R) WiFi Link 1000 BGN
GUID:***
物理アドレス:74
状態:接続されました
SSID:***
BSSID:18
ネットワークの種類:インフラストラクチャ
無線の種類:802.11n
認証:WPA2-パーソナル
暗号:CCMP
接続モード:自動接続
チャネル:10
受信速度 (Mbps):72
送信速度 (Mbps):72
シグナル:80%
プロファイル:***
ホストされたネットワークの状態:利用不可

ユーザー名を取得

HASHTBL ENV DIM str = SPLIT(DOSCMD("SET"), "<#CR>") FOR n = 0 TO UBound(str) IFB POS("=", str[n]) THEN arr = SPLIT(str[n], "=") ENV[TRIM(arr[0])] = TRIM(arr[1]) ENDIF NEXT PRINT ENV["USERNAME"] ////////////////////////////////////////////////// // 【引数】 // 配列 : 上限値を求める配列 // 【戻値】 // 配列の上限値 ////////////////////////////////////////////////// FUNCTION UBound(array[]) RESULT = RESIZE(array) FEND
解説
  1. 1行目
    HASHTBL ENV
    連想配列ENVを宣言します。環境を表すEnvironmentの略です。
  2. 3行目
    DIM str = SPLIT(DOSCMD("SET"), "<#CR>")
    コマンドプロンプトで環境変数を取得し、その結果を改行を区切り文字列としてstr配列に格納します。str[0]に1行目、str[1]に2行目という風に格納されます。
  3. 5-10行目
    FOR n = 0 TO UBound(str) IFB POS("=", str[n]) THEN arr = SPLIT(str[n], "=") ENV[TRIM(arr[0])] = TRIM(arr[1]) ENDIF NEXT
    str配列の数だけループ。
    条件
    str配列のn番目に「=(イコール)」が含まれているか
    TRUE(「=」が含まれていたら)
    「=」を区切り文字列としてarr配列に格納します。「環境変数名=値」という形で出力されるので、arr[0]に環境変数名、arr[1]に値が格納されます。
    ENV[環境変数名]に値代入します。
  4. 12行目
    PRINT ENV["USERNAME"]
    環境変数名USERNAMEを出力します。

連想配列に代入する値をTEXTBLOCKでまとめて宣言する

HASHTBL Month TEXTBLOCK String 1 睦月 2 如月 3 弥生 4 卯月 5 皐月 6 水無月 7 文月 8 葉月 9 長月 10 神無月 11 霜月 12 師走 ENDTEXTBLOCK DIM arr = SPLIT(String, "<#CR>") FOR n = 0 TO UBound(arr) t1 = TOKEN(" ", arr[n]) t2 = TOKEN(" ", arr[n]) Month[t1] = t2 NEXT PRINT Month[1] ////////////////////////////////////////////////// // 【引数】 // 配列 : 上限値を求める配列 // 【戻値】 // 配列の上限値 ////////////////////////////////////////////////// FUNCTION UBound(array[]) RESULT = RESIZE(array) FEND
結果
睦月

指定されたサービスを開始および停止できるかどうかを返す

DIM Shell = CREATEOLEOBJ("Shell.Application") DIM arr = SPLIT(DOSCMD("sc query state=all | findstr /i service_name"), "<#CR>") arr = strReplace("SERVICE_NAME: ", "", arr) FOR n = 0 TO UBound(arr) PRINT arr[n] + "<#TAB>" + Shell.CanStartStopService(arr[n]) NEXT ////////////////////////////////////////////////// // 【引数】 // search : 探したい値 // replace : 見つかった search を置き換える値 // subject : 検索・置換の対象となる文字列あるいは配列 // 【戻値】 // 置換後の文字列あるいは配列 ////////////////////////////////////////////////// FUNCTION strReplace(search, replace, subject) SELECT VARTYPE(subject) AND $2000 CASE $2000 // 配列 FOR n = 0 TO UBound(subject) subject[n] = REPLACE(subject[n], search, replace) NEXT RESULT = SLICE(subject) DEFAULT // 配列以外 RESULT = REPLACE(subject, search, replace) SELEND FEND ////////////////////////////////////////////////// // 【引数】 // 配列 : 上限値を求める配列 // 【戻値】 // 配列の上限値 ////////////////////////////////////////////////// FUNCTION UBound(array[]) RESULT = RESIZE(array) FEND
結果
AdobeARMservice False
AJRouter False
ALG False
ALUpdateService False
AppHostSvc False
AppIDSvc False
Appinfo False
AppReadiness False
AppXSvc False
aspnet_state False
AudioEndpointBuilder False
Audiosrv False
autotimesvc False
AxInstSV False
BDESVC False
BFE False
BITS False
BrokerInfrastructure False
BTAGService False
BthAvctpSvc False
bthserv False
camsvc False
CDPSvc False
CertPropSvc False
CLHNService False
ClipSVC False
COMSysApp False
CoreMessagingRegistrar False
cphs False
CryptSvc False
CypherGuard cguard Service 32bit Edition False
CypherGuard cguard Service 64bit Edition False
CypherGuard Info Service False
dbupdate False
dbupdatem False
DbxSvc False
DcomLaunch False
defragsvc False
DeviceAssociationService False
DeviceInstall False
DevQueryBroker False
Dhcp False
diagnosticshub.standardcollector.service False
diagsvc False
DiagTrack False
DispBrokerDesktopSvc False
DisplayEnhancementService False
DmEnrollmentSvc False
dmwappushservice False
Dnscache False
DoSvc False
dot3svc False
DPS False
DsmSvc False
DsSvc False
DusmSvc False
Eaphost False
EFS False
embeddedmode False
EntAppSvc False
EventLog False
EventSystem False
Everything False
Fax False
fdPHost False
FDResPub False
fhsvc False
FontCache False
FontCache3.0.0.0 False
FrameServer False
Freemake Improver False
FreemakeVideoCapture False
GoogleChromeElevationService False
GoogleIMEJaCacheService False
gpsvc False
GraphicsPerfSvc False
gupdate False
gupdatem False
hidserv False
HvHost False
icssvc False
IDriverT False
IKEEXT False
ImeDictUpdateService False
InstallService False
iphlpsvc False
IpxlatCfgSvc False
KeyIso False
KtmRm False
LanmanServer False
LanmanWorkstation False
lfsvc False
LicenseManager False
LLHDClient False
LLHDCloader False
lltdsvc False
lmhosts False
LMS False
LSM False
LxpSvc False
MapsBroker False
MixedRealityOpenXRSvc False
MozillaMaintenance False
mpssvc False
MSDTC False
MSiSCSI False
msiserver False
MSMQ False
MSSQL$SQLEXPRESS False
MSSQLServerADHelper100 False
NaturalAuthentication False
NcaSvc False
NcbService False
NcdAutoSetup False
Netlogon False
Netman False
NetMsmqActivator False
NetPipeActivator False
netprofm False
NetSetupSvc False
NetTcpActivator False
NetTcpPortSharing False
NgcCtnrSvc False
NgcSvc False
NielsenUpdate True
NlaSvc False
nsi False
nurago InstallUpdate False
nurago NetworkMeter False
nurago Reporting Service False
ose64 False
osppsvc False
p2pimsvc False
p2psvc False
PBExtractService False
PcaSvc False
perceptionsimulation False
PerfHost False
PhoneSvc False
pla False
PlugPlay False
PNRPAutoReg False
PNRPsvc False
PolicyAgent False
Power False
PrintNotify False
ProfSvc False
PushToInstall False
QWAVE False
RasAuto False
RasMan False
RemoteAccess False
RemoteRegistry False
RetailDemo False
RmSvc False
RpcEptMapper False
RpcLocator False
RpcSs False
SamSs False
SCardSvr False
ScDeviceEnum False
Schedule False
SCPolicySvc False
SDRSVC False
seclogon False
SecurityHealthService False
SEMgrSvc False
SENS False
SensorDataService False
SensorService False
SensrSvc False
SessionEnv False
SgrmBroker False
SharedAccess False
SharedRealitySvc False
ShellHWDetection False
shpamsvc False
smphost False
SmsRouter False
SNMPTRAP False
spectrum False
Spooler False
sppsvc False
SQLAgent$SQLEXPRESS False
SQLBrowser False
SQLWriter False
SSDPSRV False
ssh-agent False
SstpSvc False
StateRepository False
stisvc False
StorSvc False
svsvc False
swprv False
SynTPEnhService False
SysMain False
SystemEventsBroker False
SystemExplorerHelpService False
TabletInputService False
TapiSrv False
TeamViewer False
TermService False
Themes False
TieringEngineService False
TimeBrokerSvc False
TMachInfo False
TODDSrv False
TokenBroker False
TosCoSrv False
TOSHIBA eco Utility Service False
TOSHIBA HDD SSD Alert Service False
TosRzTfSvc False
TPCHKarteSVC False
TPCHSrv False
TrkWks False
TroubleshootingSvc False
TrustedInstaller False
tzautoupdate False
UmRdpService False
UNS False
upnphost False
UserManager False
UsoSvc False
VacSvc False
VaultSvc False
vds False
vmicguestinterface False
vmicheartbeat False
vmickvpexchange False
vmicrdv False
vmicshutdown False
vmictimesync False
vmicvmsession False
vmicvss False
VSS False
VSStandardCollectorService150 False
W32Time False
w3logsvc False
W3SVC False
WaaSMedicSvc False
WalletService False
WarpJITSvc False
WAS False
wbengine False
WbioSrvc False
Wcmsvc False
wcncsvc False
WdiServiceHost False
WdiSystemHost False
WdNisSvc False
WebClient False
Wecsvc False
WEPHOSTSVC False
wercplsupport False
WerSvc False
WFDSConMgrSvc False
WiaRpc False
WinDefend False
WinHttpAutoProxySvc False
Winmgmt False
WinRM False
wisvc False
WlanSvc False
wlidsvc False
wlpasvc False
WManSvc False
wmiApSrv False
WMPNetworkSvc False
workfolderssvc False
WpcMonSvc False
WPDBusEnum False
WpnService False
wscsvc False
WSearch False
wuauserv False
WwanSvc False
XblAuthManager False
XblGameSave False
XboxGipSvc False
XboxNetApiSvc False
AarSvc_64da0 False
BcastDVRUserService_64da0 False
BluetoothUserService_64da0 False
CaptureService_64da0 False
cbdhsvc_64da0 False
CDPUserSvc_64da0 False
ConsentUxUserSvc_64da0 False
CredentialEnrollmentManagerUserSvc_64da0 False
DeviceAssociationBrokerSvc_64da0 False
DevicePickerUserSvc_64da0 False
DevicesFlowUserSvc_64da0 False
MessagingService_64da0 False
OneSyncSvc_64da0 False
PimIndexMaintenanceSvc_64da0 False
PrintWorkflowUserSvc_64da0 False
UnistoreSvc_64da0 False
UserDataSvc_64da0 False
WpnUserService_64da0 False

二次方程式を解く

二次方程式

\[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