基本的な関数

 Basic プログラムでは基本的な文の他に,多くの関数を使うことが出来ます。ここではそれらのうち最も基本的なものについて説明します。個々の関数の詳しい使い方や,使える関数全体はマニュアルの関数の項目にありますので,そちらも適宜参照して下さい。

 ここで説明する関数は,予め Basic が持っている関数のことですが, Basic ではユーザーが独自の関数を定義して使うことも出来ます。そのような関数をユーザー定義関数と言います。それに対して,予め Basic が持っている関数のことを内蔵関数と言います。

 関数は標準的な Basic の関数は大体使えます。その他に Tiny Basic 独自の関数もかなりあります。


 基本的な内蔵関数を機能から分類すると次のようになります。

このほかに,Tiny Basic 独自の

や,ちょっと便利な

そして少し高度な

などがあります。ここでは,数値関数,数学関数,文字列関連関数,整数論的関数,日付時刻処理関数から基本的なものについて説明します。

関数の使い方

 まず,関数の一般的な形について説明します。関数は 

Abc(x)

や 

Fx$(s$,y)

などの形で使います。ここで,Abc(x) では Abc が関数名,x が引数(argument)です。引数が1つの場合1変数関数,2つの場合,2変数関数と言います。上の例で,Fx$(s$,y)は2つの引数s$ と y を持っています。引数の持たない関数もあります。

 引数の場所には,普通マニュアルの説明では変数が書かれます。しかしここで表していることは,そこの位置に数値あるいは文字列が置かれるということです。ですから,変数でなくても値が同じ型であれば,式を置くことも出来ます。

 例えば,Abc(x) と書かれているのは,x の位置に数値が置かれることを意味しています。ですから,実際のプログラムで Abc(1) と言った数値定数や,Abc(x+y*z) といったように,値が数値になる式 x+y*z を置くことも出来ます。

 一般的には値が数値のものを数値関数,値が文字列のものを文字列関数と言います。また Tiny Basic では値を論理値(真偽)に取る論理関数もあります。しかし,以下での分類は機能をもとにした分類で少し違います。

 関数は,式を作るとき使います,式の作り方は「式とその構成要素」の項で説明しましたが,式の構成要素としての使い方は,変数や定数と同様です。例えば,Abc(x) という関数は,数値を値に取る関数とすると,Abc(x)を数値定数や数値変数と同様にして使えます。ですから Abc(x) を使って

(1+Abc(x)*3)/2

という式を作ることが出来ます。また,Fx$(s$,y)が文字列を値に取る関数とすると,

"Test"+Fx$(s$,y)

という式を作ることが出来ます。


 具体的な関数の説明をしましょう。まず数値関数について説明します。

数値関数

 数値関数は値を数値にとる関数のうち,数の基本的処理を行う関数です。ここでは

について説明します。

絶対値 Abs

 Abs はAbsolute Value (絶対値)の意味です。

Abs(X)

の形で使い,X の絶対値を与えます。


 絶対値は,正数または0の場合,そのままの値を返し,負の数は符号を正にした値を返します。例えば

Abs(3.5)=3.5 
Abs(0)=0
Abs(-3.5)=3.5 

となります。

整数部分 Int

 Int はInteger (整数)の意味です。

Int(X)

の形で使い,X の整数部分を与えます。


 Int(X)は,正確にはX 以下の最大の整数を与えます。ガウス記号と同じです。ですから, X が負の時,注意が必要です。 例えば

Int(3.5)=3 
Int(-3.5)=-4 

となります。

切り上げ Ceil

 Ceil は上張りをする,或いは天井を張るといった意味ですが, ここでは整数へ切り上げするの意味です。

Ceil(X)

の形で使い,X の小数部分を切り上げて整数にします。


 Ceil は正の方向に切り上げをします。 ですから,例えば

Ceil(-2.8)=-2
Ceil(2.8)=3
Ceil(2)=2
Ceil(-1)=-1

となります。

四捨五入 Round

 Round は,丸めるの意味で,四捨五入して一番近い整数を返します。

Round(N)

の形で使います。


Round(N) は N を四捨五入した値を返します。N が負の場合は,絶対値を四捨五入したものに-1 を掛けたものを与えます。ですから,例えば

Round(0.5)=1
Round(-0.5)=-1

となります。

符号 Sgn

Sgn はSign (符号)の意味です。

Sgn(X)

の形で使い,X の符号を与えます。
 Sgn(X)は, X の符号を与えますが,+-と与えるわけではありません。

X が正の時 Sgn(X)=1,
X が 0 の時 Sgn(X)=0,
X が負の時 Sgn(X)=-1 

の様に符号を与えます。例えば,

Sgn(1)=1
Sgn(0)=0
Sgn(-2)=-1

となります。


 次に数学関数について説明しましょう。

数学関数

 数学関数は値を数値にとる関数のうち,数学的で使われる関数です。Basic では数学で使われる多くの関数が使えます。主なものをあげると,

などです。この他に逆3角関数,双曲線関数,常用対数など使えます。

円周率 Pi

 円周率 Pi は関数と言うより定数ですが,

Pi

という記号で表します。Pi は実際には 3.14159265358979 を表します。

3角関数 Sin, Cos, Tan

 3角関数は数学で普通に使われていものです。初期設定では,角度は弧度法で表されますが,60分法 を使うことも出来ます。

 初期設定で使うと,弧度法で表され,

Sin(Pi/2)=1
Cos(Pi/4)=0.707106781186548
Tan(Pi/4)=1

のようになります。60分法を使うには,Degrees コマンドを使います。例えば,

Degrees
Print Sin(45)

とすると,結果は サイン45度

0.707106781186548

となります。弧度法に戻すには, Radians コマンドを使います。

 3角関数ではこの他に,コタンジェント Cot,セカント Sec ,コセカント Csc が使えます。また逆3角関数として,アークタンジェント Atn,アークサイン ASin,アークコサイン ACos が使えます。


  次のプログラムはサインとコサインの表を表示します。

Degrees
Print "Sin","Cos","角度"
For i=0 to 45 step 5
   Print Sin(i), Cos(i),i
Next i
End
平方根 Sqr

 Sqr は平方根(Square Root)の意味です。

Sqr(x)

の形で使い, X の平方根を与えます。X が負の場合はエラーになります。例えば

sqr(2)=1.4142135623731
sqr(10)=3.16227766016838

となります。X^(1/2)としてもX の平方根が得られます。また,X の立方根は X^(1/3)で得られます。


 次のプログラムは平方根と3乗根の表を与えます。

Print "平方根","3乗根"
For i= 1 to 5
   Print Sqr(i), i^(1/3), i
Next i
End
指数関数 Exp,対数関数 Log

  指数関数は Exp です。Exp はExponential (指数)の意味です。

Exp(x)

の形で使い,自然体数の底をe (=2.71828 …)とするとき, e のx 乗を与えます。例えば

exp(1) = 2.71828182845905 = e
exp(10)= 22026.4657948067

となります。

 その逆関数が対数関数Log(x) です。Log は Logarithm(対数)の意味で,

Log(x)

の形で使い,x に対して,x =Exp(y)となるy をLog(x)として与えます。例えば

Log(2)=0.693147180559945
Log(100)=4.60517018598809

となります。

 Log(X)は自然対数e を底にする対数(自然対数)です。常用対数(10 を底にする対数)はLog10 で与えられます。また2を底とする対数はLog2 で与えられます。

 


 次のプログラムは指数関数と対数関数の表を与えます。

Print "Exp","Log"
For i= 1 to 5
   Print Exp(i), Log(i), i
Next i
End
最大値 Max,最小値 Min

 2つの数の大きい方または小さい方を指定するのが,最大値 Max, 最小値 Min です。 Max は Maximum(最大),Min は Minimum (最小)の意味です。最大値は

Max(x,y)

の形で使い,x と y のうち大きい方を与えます。最小値は

Min(x,y)

の形で使い,x と y のうち小さい方を与えます。例えば,

Print Max(3,4)
Print Min(3,4)

を実行すると,

4
3

と表示されます。

乱数 Rnd

 プログラムによっては乱数が必要なこともあります。Basic では乱数を与える関数 Rnd が使えます。Rnd は Random Number (乱数)の意味です。乱数を関数というのは少し違和感がありますが,普通このように言われます。

 乱数はいくつかの使い方がありますが,ここでは最も標準的な場合だけを説明します。乱数を与えるには

Rnd(1)

のようにして使います。 Rnd としても同じです。乱数ですから,引数が同じでも違う数を返します。例えば,

For i=1 to 10
   Print Rnd(1)
Next i

とすると,10個の乱数が表示されます。

 但し,乱数と言ってもコンピュータの内部ではある方法によって計算されています。そして普通に上のプログラムを動作させると,10個の異なった数を表示させますが,実行のたび毎回同じ10個の数が表示されます。
 実際に上のプログラムを2,3回実行してみて下さい。

 これを避けるために, Randomize コマンドを使います。 Randomize コマンドは内部時計を使って乱数の初期化を行います。この文を上のプログラムに付け加えると,実行ごとに違った乱数が表示されます。

Randomize
For i=1 to 10
   Print Rnd(1)
Next i

 実際にこのプログラムを2,3回実行して,上のプログラムとの違いを確認して下さい。


 次に文字列関連関数について説明しましょう。

文字列関連関数

 コンピュータは計算機といわれ,数の計算が主なように思われますが,コンピュータは数の計算だけでなく文字列に対する色々な処理も得意です。 Basic でワープロを作るのは速度的に無理がありますが,色々な文書処理を Basic プログラムで行うことも出来ます。

 また文書処理だけでなく,普通のプログラムでも,文字列に対する処理が必要なこともあります。 Basic ではそのような目的のために多くの文字列の処理に関連した関数を用意しています。ここではその主なものとして次を説明します。

 

文字列抽出関数 Left$,Mid$,Right$

 文字列の中からいくつかの文字列を抽出することが必要なこともあります。そのための関数が, Left$,Mid$,Right$です。 

 Left$ は 左側から何文字かを抽出するときに使います。Left$ は

Left$(X$,I)

の形で使い,文字列 X$ の左から I 番目迄の文字列を与えます。

 Mid$ は中間の文字列を抽出するときに使います。Mid$ は

Mid$(X$,I,J)

の形で使い,文字列 X$ の I 番目からJ 個の文字からなる文字列を与えます。

 また, Right$ は右側から何文字かを抽出するときに使います。Right$ は

Right$(X$,I)

の形で使い,文字列 X$ の右から I 番目迄の文字列を与えます。

 例をあげましょう。

A$="Computer" のとき,

Left$(A$,3) = "Com"
Mid$(A$,4,2) = "pu"
Left$(A$,2) = "er"

となります。

 
数値・文字列変換 Str$,Val

 Basic で扱う対象は数値と文字列でした。我々日常的には 1 という数字を見たとき,これは数なのか,数字なのか,厳密に区別して扱ってはいません。状況に応じで,数と見たり数字と見たりしています。また,1+2 というものを見たときも,式なのか文字列なのか日常的には区別しません。

 一方,Basic ではこの区別は厳密です。例えば

Print 1+2

とすると, 3 と表示されます。 1+2 と表示したい場合は

Print "1+2"

としなくてはなりません。しかし,時には両方の意味に用いたいときもあります。 Basic では 数値と文字列は形式が違いますから,同じものを2つの意味に使うことは出来ませんが,それらを互いに変換することは出来ます。そのための関数が Str$ と Val です。

 Str$ はString(文字列)の意味で,数値を文字列に変換するとき使います。

Str$(数値)

の形でつかい,数値を文字列に変換します。例えば,

A$=Str$(12)

は A$="12" と同じです。このような数値定数の場合は, Str$ を使う理由はあまりありませんが,Str$(x) のように数値変数の場合など有効です。

 Str$ の逆変換をするのが, Val 関数です。 Val はValue(値)の意味です。

Val(文字列)

の形で使い,文字列を対応する値に変換します。例えば,

B=Val("12")

は B=12 と同じです。


Str$ と Val を使ったプログラムをあげましょう。

For i=1 to 10
   A = i^4
   B$ = Right$(Str$(A),1)
   C = Val(B$)
   Print A,B$,C^4
Next i

このプログラムは,4乗した数 A の下1桁を B$ として,それを更に数として,4乗した結果を表示するものです。結果を見ると表示された数の下1桁はすべて同じですね。

文字列性質関数 Len,InStr

  文字列性質関数 Len,InStrは文字列の性質を調べるものです。

 Len はLength(長さ)の意味で,文字列の長さを与えます。

Len(X$)

の形で使い,文字列X$ の長さを与えます。

 また,InStr は文字列の中にある文字列を探します。InStr はIn String (文字列の中で)の意味で,

InStr(n,A$,B$)

の形で使い,文字列A$ のn 番目からの文字から,文字列B$ を探し,見つかればその位置を開始位置からの半角文字数で与えます。見つからない場合0 を返します。例えば

A$ = "Tiny Basic"
B$ = "in"
s = InStr(1,A$,B$)
t = InStr(2,A$,B$)
u = InStr(3,A$,B$)

を実行すると,s = 2, t = 1, u = 0 となります。

大文字・小文字変換 UCase$,LCase$

  大文字・小文字変換関数は文字を大文字にしたり,小文字にしたりします。

 UCase はUpper Case(大文字活字箱)の意味です。

UCase$(A$)

の形で使い,文字列A$ を大文字に変換します。全角文字にも対応しています。例えば

A$=UCase$("This is test")

とすると,A$="THIS IS TEST" と同じことになります。 

 LCase はLower Case(小文字活字箱)の意味です。

LCase$(A$)

の形で使い,文字列A$ を小文字に変換します。全角文字にも対応しています。例えば

A$=LCase$("This is test")

とすると,A$="this is test" と同じことになります。


 これらを使ったプログラムの例をあげましょう。少し複雑ですが,今まで説明した文と関数しか使っていません。復習として,プログラムを解析してみて下さい。

Input "英文を入力して下さい"; In$ 
N = Len(In$) 
If Right$(In$,1)="." then
   N = N - 1 
   In1$=Left$(In$,N) 
Else 
   In1$=In$ 
End if
StPt=1
EndPt=1
While StPt <= N 
   EndPt = InStr(StPt,In1$," ")
   If EndPt = 0 then
      EndPt = N
   Else
      EndPt = EndPt + StPt - 1
   End if
   LenOfW = EndPt-StPt+1
   W$=Mid$(In1$,StPt, LenOfW)
   Out$ = Out$ + UCase$(Left$(W$,1))+LCase$(Right$(W$,LenOfW-1))
   StPt = EndPt+1
Wend
Out$=Out$+"."
Print Out$
End

このプログラムは入力した英文を空白で単語に切り分け,その先頭文字を大文字,他を小文字にして表示します。例えば入力ボックスに対して

tHis is tEst pROGram.

と入力すると

This Is Test Program.

と出力されます。


 上のプログラムの仕組みについて説明します。説明のために行番号を付加します。

2行で入力文字列の長さを N とします。
3行から8行は文字列最後のピリオド"." があればそれを取り除いています。
StPt は単語の先頭位置,EndPt は単語の最後位置(空白を含む)です。
11行から22行の間単語を抽出して,それを Out$ に付加していきます。
12行では単語の先頭位置から,次の空白位置を探します。
見つかれば,入力文字列での位置を EndPt とします。空白が無ければ,最後までが単語と判断します。
これらの処理が,12行から17行です。
18行では単語の長さを,LenOfW とし,
19行でその単語を W$ とします。
20行ではその単語の先頭を大文字,残りを小文字に変換し,それを既に処理済の Out$ に付加します。
21行で次の単語の先頭を単語の次に設定して繰り返します。

01 Input "英文を入力して下さい"; In$ 
02 N = Len(In$) 
03 If Right$(In$,1)="." then
04    N = N - 1 
05    In1$=Left$(In$,N) 
06 Else 
07    In1$=In$ 
08 End if
09 StPt=1
00 EndPt=1
11 While StPt <= N 
12    EndPt = InStr(StPt,In1$," ")
13    If EndPt = 0 then
14       EndPt = N
15    Else
16       EndPt = EndPt + StPt - 1
17    End if
18    LenOfW = EndPt-StPt+1
19    W$=Mid$(In1$,StPt, LenOfW)
20    Out$ = Out$ + UCase$(Left$(W$,1))+LCase$(Right$(W$,LenOfW-1))
21    StPt = EndPt+1
22 Wend
23 Out$=Out$+"."
24 Print Out$
25 End

 次に Tiny Babsic 独自の関数である整数論的関数について説明します。

整数論的関数

 整数論的関数は,高校の数学の範囲に出てくる,初等整数論的関数で,あると便利と思われるものを付け加えたものです。

 これらの関数は標準的な Basic にはありませんが,数式処理的な言語にはある標準的なものです。

Tiny Basic で現在使えるものは以下のもです。

です。

2項係数 Binomial

 Binomial は 二項の意味です。ここではBinomial Coefficient (二項係数)を意味します。

Binomial(n,r)

の形で使い,(x+1)^nの二項展開のx^rの係数を与えます。これはn 個のものから, r個取る組み合わせの個数と同じです。Binomial の省略形として, Binom も使えます。

 例えば

Binomial(20,11)=167960 
Binomial(32,15)=565722720

になります。精度の問題から,Binomial は大きな数では正確な値を与えませんが,概数は分かります。

階乗 Factorial

 Factorial は 階乗の意味です。

Factorial(n)

の形で使い,n の階乗n!を与えます。Factorial の省略形として, Fact も使えます。


 例えば

Factorial(9)=362880 
Factorial(15)=1307674368000

になります。 精度の問題から,Factorial は19!までしか正確な値を与えませんが,それ以上の数でも概数は分かります。

最大公約数 GCD,最小公倍数 LCM

 GCD は Great Common Divisor (最大公約数)の意味です。

GCD(a,b)

の形で使い,整数a とb の(正の)最大公約数を与えます。

 例えば

GCD(9,15) = 3
Gcd(126582,127823) = 1241

になります。


 LCM は Least Common Multiple (最小公倍数)の意味です。

LCM(a,b)

の形で使い,整数a とb の(正の)最小公倍数を与えます。


 例えば

LCM(9,15) = 45
LCM(123,234) = 9594

になります。

最小素因数 PrimeFactor

 Prime Factor は素因数の意味でが,ここでは最小素因数の意味です。

PrimeFactor(n)

の形で使い,n の最小素因数を与えます。PrimeFactor の省略形として, PFactor も使えます。


例えば

PrimeFactor(1234567) = 127 

になります。

if n = PrimeFactor(n) then ...は素数の判定になっています。


 次のプログラムは素因数分解をします。

Input "自然数 n を入力して下さい。";n
If n > 0 then
   Print n
   Print " =";
   While n>1
      p = PrimeFactor(n)
      Print p;
      n = n / p
      If n > 1 then
         Print " *";
      End if
   Wend
   Print
End if 

 最後に日付時刻処理関数について説明します。

日付時刻処理関数

 日付時刻処理関数は多くの言語で使えますが,Tiny Basic でも色々使えます。

 日付時刻処理関数は文字通り,日付や時刻に関するもので,時間やカレンダーなどの処理の時に使います。ここでは以下のものを簡単に説明します。

 

日付関数 Date$

 Date$ は現在の日付を読み出します。結果は"YYYY/MM/DD"の形の文字列です。ここで,

YYYY は 西暦 (0000-9999)
MM は 月 (01-12)
DD は 日 (01-31)

を表します。例えば次は今日の日付を表示します。

Print Date$

曜日関数 DayOfWeek

 DayOfWeek は曜日の意味です。

DayOfWeek(日付)

の形で使い,その日の曜日を返します。ここで日付は Date$ の返す形 "YYYY/MM/DD"の形の文字列です。曜日は日曜日が 1,・・・,土曜日が7です。

 例えば,次は今日の曜日を表示します。

NDays$="日月火水木金土"
Print "今日は";Mid$(NDays$,2*DayOfWeek(Date$)-1,2);"曜日です。"

時刻関数 Time$

 Time$ は時刻に意味です。

  Time$

の形で使い,現在の時刻を与えます。Time$ は 8半角文字からなる文字列で,HH:MM:SS の形式をしています。

ここで
HH は時間(00-23)
MM は分(00-59)
SS は秒(00-59)

を表します。例えば

Print Time$

はHH:MM:SSの形で時間を表示します。

閏年関数 IsLeepYear

  Is Leap Year はうるう年か?と言う意味です。

IsLeapYear(年)

の形で使います。ここで年は自然数です。その年がうるう年の場合, 真(True)を返します。そうでない場合偽(False)を返します。

例えば,次のプログラムはうるう年の判定をします。

Input "西暦年を入力して下さい。";y
If IsLeapYear(y) then 
   Print y;"年はうるう年です。" 
Else
   Print y;"年はうるう年ではありません。" 
End if
時間関数 GetHour

 Hour は時間の意味です。

GetHour 

の形で使い,現在の時間を0から23で表します。

分関数 GetMinute

 Minute は分の意味です。

GetMinute 

の形で使い,現在の分を0から59で表します。

秒関数 GetSecond

 Second は秒の意味です。

GetSecond 

の形で使い,現在の秒を0から59で表します。

 次は現在の時間を表示します。

Print "現在は";GetHour;"時";GetMinute;"分";GetSecond;"秒です。"


 最後にプログラムの例をあげましょう。次のプログラムは今日は元旦から何日目かを計算するものです。

' 今日は元旦から何日目
D$=Date$
Year = Val(Left$(D$,4)) 
Month = Val(Mid$(D$,6,2))
Day = Val(Right$(D$,2))
Counter = 0
MonthData$="312831303130313130313031" :' 各月の日数
For i=1 to Month -1
   CurMonth = Val(Mid$(Monthdata$,2*i-1,2))
   If (i = 2) and IsLeapYear(Year) then
      CurMonth = 29
   End if
   Counter = Counter + CurMonth
Next i
Counter = Counter + Day
Print "今日は元旦から";Counter;"日めです。"