文字列と数式
-2008年7月16日改訂-


文字列と数値

数式



文字列と数値

定義する方法

 文字列は単語、文書、文字、数値は整数、小数点などです。

BASICでは数値、文字列はアルファベット2文字までで定義します。

文字列の場合は最後に$を付けます。

・代入

A=5:I$=”こんにちは”

・文字数を代入

I$=”こんにちは”:A=LEN(I$)


 となります。この場合はAに5が入り、I$に「こんにちは」が入ります。
2つ目は文字数を返しAに5が入ります。

・右から5文字”H”をとり、これを検索。HELLOと表示

I$=”U−YAN,HELLO”:A=LEN(I$):II$=MID$(I$,7,1):L=INSTR(I$,II$):? MID$(I$,L)

 ?はPRINTになります。
左から4文字をとる場合はLEFT$(A$,4)
右から4文字をとる場合はRIGHT$(A$,4)
左から4文字目から3文字取り出す場合はMID$(A$,4,3)
指定した文字「.」が入っていたら何文字目か返す場合はINSTR(A$,”.”)

*10進数を16進数で表示させる公式では

A$=RIGHT$(”0”+HEX$(11)),2)

これはHEX$で0BがBになる時のために、あらかじめ0を加えておき

1文字の場合は0B(ゼロビー)2文字の場合はOFF(ゼロエフエフ)という文字列になります。
しかし、RIGHT$の2が効いているので右から二文字のFFとなります。
BIN$の場合は最低ゼロを7つ用意しておき2を8にします。

・通し番号をふり、自動ファイル名作成

 今度は20でも100でも1000でもこい!!

10 FORI=0TO300:F$=”FILE0000.BAS”:L2=INSTR(f$,”.”):L=LEN(STR$(I))−1:MID$(F$,L2−L)=RIGHT$(STR$(I),L):PRINTF$:NEXT

 <<プログラムが長いので行番号にして作りました>>

 実行するとリストアップされます。実用にはFOR〜NEXT分を外し、あとI変数を変えるだけです。
I=29とすればFILE0029となります。00がいらないようでしたら、FILE00.BASにしてもよいです。

 解説はL2にピリオドの場所を調べる。Lは文字数を獲得するがSTR$の特性で前に空白が入って 29というふうになるため、この場合3−1にしていま す。次にMID$で文字分だけバック。233ならL2から3文字戻るようにして、そこから文字列を書き換える。これは、、、書き込んでいる時は覚えている けど忘れるので、暗記しておくといいかもしれない。。。

F$をF$=”EXCEL〜0.BAS”というふうにWindows風にもできる。注意することは文字を右寄せで書き換えるのでピリオドを必ず入れないとできない。拡張子なしのファイルには対応していません。

定義内容を表示する方法

 定義内容を表示する方法はPRINT命令で行えます。

PRINT A;I$

となります。実行が成功すると5 こんにちはとなります。

・括弧をつける方法

 電卓のように計算をしてみましょう。まずは数を定義します。

A=45+35+68+95:PRINT A

243になります。Aから加算した平均値をBに求めてみましょう。

B=A¥4:PRINT B

このようになります。それから、もう1つ括弧で1つの式にしてみましょう。

A=(45+35+68+95)¥4:PRINT A

・文字を加える

 今度は文字列です。文字列を加えてみます。
I$=”こんにちは”:A$=”うーやん”:PRINT I$;A$;”さん。”

このようにI$の後に続ける場合は;セミコロンにします。

次にI$の定義にうーやんを入れてみましょう。

I$=I$+A$:PRINTI$

このようになります。

 

数式

ランダム

  さて、ランダムという乱数を発生させる変数は0以上1未満の乱数を発生させます。
R=RND(−TIME)
 また、このようにTIME変数が入っていると時間によって異なる数字を出します。
R=RND(0)というふうにすれば直前の値を読むことができます。

次に

R=INT(RND(1)*16)

1〜15まで変化させる場合の式です。Rに16という数は出ません。
RND(1)が0.1542356となり、これを16倍するということです。それからINTで整数が4.12487555というのが4になります。

四則演算の仕方

 +たし算、−はひき算、*はかけ算、/はわり算、¥はわり算の整数部分、MODはわり算の余りの数、^は累乗。

面積C=底辺A×高さB÷2

C=(A*B)/2

10割る3の余りと整数

整数:
C1=10¥3
あまり:
C2=10MOD3

10の3乗

10×10×10

C1=10^3

4000円からAさんは1200円、Bさんは1500円。おつりは?

C=4000-(1200+1500)

ついでに電卓でやると、1200+1500[M+]として、Cを押さないで4000−[RM]でOKです。
 括弧は先に計算してその結果をメモリに入れることができます。

 税抜きの価格1500円から税込みの価格は?
消費税5%は100分の5であるから、1は1500円

C=1500*1.05

 Aさんが30点、Bさんが64点、Cさんが55点の3人の平均点は?

AA=(30+64+55)¥3


数の定義の有効範囲

  初期状態の変数の定義では有効数字14桁(小数点含む)精度の実数になります。
整数は2バイト、単精度は4バイト、倍精度は8バイトのメモリを使います。
 単精度、倍精度は1億5000万、.05など、あまりにも小さい、大きいという数に使用する目的です。
変数は通常では倍精度型実数※になっており、3者の中で一番処理が遅く、
DEFINTA−Zで整数型にして高速化します。
14桁までの数を表示させられます。
15桁になるとE+14と表示されて15桁目の数は四捨五入になります。
さらに指数であれば10^62(1E+62)まで表示できることです。

※MSX以外では1E+38、1E-39までの演算が限界です。通常は単精度型です。
左が電卓の数値、右がMSXBASICの指数定数

10000000=1E+7

1.0000000E=1E+8

10.000000E=1E+9

100.00000E=1E+10

1000.0000E=1E+11

10000.000E=1E+12

100000.00E=1E+13

1000000.0E=1E+14

999999999.E=1E+15

指数の場合は10の3乗が1E+3です。10の0ゼロが3あると思えばいい。

最高63桁の左から14桁まで表示されます。

参考までに8桁電卓の場合はおおよその数を16桁の左から8桁まで表示できます。

14桁以下でこのように表せば実数として返しますし、このことを知らなければ何だろ?と思うから暗号にもなる?でしょう。

この14桁まで実数を表示できるモードを倍精度実数といいます。

そのほか6桁までの実数を単精度実数、整数は-32768〜+32767で小数点は使わない数値型モードがあります。

処理を早くする場合はDEFINT A-Z、すべてを整数に使う文字型モードにする意味ありげな命令は実はこういうことだったんですね。

 要するに電卓では浮動小数点にならないので、このような表記になります。

浮動小数点演算の例:0.23-0.045=0.185

指数表記:(2.3E-1)-(4.5E-2)=1.85E-1

プログラムに指数表記をしたい場合は直で行うと実数表記になってしまいます。
なお、MicrosoftExcelで=で入力しても大きな数になると省略されてしまうようですが、1E+80など計算はできるようです。
例:(1E+60)+(1E+51)

ちょっと小学校レベルでもわかるように遊んでみましょう。
100×10=1000、10×10×10=1000。
1.25×10=12.5、125÷10=12.5
ということは小数点が動いても答えが同じになります。
125×5.2=650、12.5×520=6500
この小数点かゼロを仮数の65に加えれば答えになります。
仮数の有効数字を越えない範囲であれば何でも可能です。
およそ1600万人であれば1000人単位で処理をすればいいわけです。
1600万人と43人とすれば別ですが、この応用が浮動小数点の演算です。
0.023とか0.23とか2.3とか23とか230とか点が浮きますよね。これを指数部
として23というのが仮数部で処理をします。
だから大きな計算、小さな計算がMSXでも可能になるわけです。
もっと詳しく説明しようと思いますが、このページでは足りない部分があります。
>>この構造についてはBCD(二進十進表現)で説明します<<
http://www.geocities.jp/fullmsx2/u-yan/basic/hexa.html

うっとおしいので指数表記の文字型を数値に変換します。
I=VAL("1E+10")

INT % 整数
SNG ! 単精度
DBL # 倍精度

FOR〜NEXTもFOR I=0 TO 10 STEP 0.5というふうに小数が使えます。
「こんな記述じゃ、エラーかな。」「おおっ!使えるじゃないか。」

と、今はグラフィックアクセラレータというハードがやっている事なんですが、当時としては凄い技術だったのかもしれません。
BASICは高級言語でどんな用途にも使える開発言語ということだったのか、かなりいい機能でした。
サンプルとしてMSX2+パワフル活用法などに球体のレイトレーシングなど(時間はかかります)今に通じるようなモノがあります。
誤差が生じるので およその数がわかればいいなどという数値に向いています。

その他の関数

 平方根はSQR関数です。
ルートを使った式は工夫してつくります。
分数の100分の1の場合は100/1になります。複雑な分数式は

A=3−2:B=4+5:C=A/B

このように上の数式と下の数式を定義するとよいかもしれません。

7xの場合は7*Xになります。πは変数定義します。A=3.141592

 

三角関数

 SIN、COS、TAN、ATNはラジアンで計算します。

■ラジアンという単位

360度が2πラジアン。
 180をπラジアンすなわち1として考える方法です。これなら、90度が2分の1πラジアン。πはおまけと思えばよいわけです。
 多角形の弧を例えば2πラジアンを正三角形ならば3つ、正五角形ならば5つと割れば使えます。弧度法は円を割って考える時に便利です!
60分割すると秒針、12分割すると時針

例えば円グラフは100を割って、39パーセント、71パーセントとなりますね。
 円を360度を割っただけの考えより、すっきりするんじゃないでしょうか?

■三角比

 直角三角形を例にしてみるとサイン(SIN)は斜辺分の高さ、コサイン(COS)は斜辺分の底辺、タンジェント(TAN)は底辺分の高さになります。

 底辺AC、斜辺ABの頂点Aの内角をわかりやすく、 θ(シータ)とした場合のCOSはAB分のBCになります。シータに対してのCOSがどの辺になるかこれさえ出せればいいのです。

 あとは三角関数SIN、COSを使ってラジアンを出したりすればいいわけです。

これから算出されたX=-0.234,Y=0.12などの数にランダムで話したように10倍などとすると原点から算出点への線がでてきます。

これで3時の方向、9時の方向というふうになります。

Excelにもありますので試してみてください。

アナログ時計:
http://www.geocities.jp/fullmsx2/u-yan/msxi-ex3.html

不等号の表し方

A>5でAは5より大きいとなります。この場合Aが6以上の数になります。

 

範囲を設定する場合は

A<5 AND A>10となります。これはIF関数を使用します。

以上はA>=5、以下はA<=5に未満はA<5になります。

グラフを作る場合は左上が原点の0座標で左、下と数が増えていきます。
まず、原点を中央付近に定義する必要があります。そこから上は-1、左は-1というふうになります。

指数関数

 指数関数は累乗は^2。2の2乗は2^3(2×2×2)となります。
数式に関数を加えることができます。

A=EXP(8)+12:B=LOG(2):PRINT A,B

その他、絶対値、+−符号などを扱う関数などがあります。


アドレスを指定

このようなことがありませんか?

? HEX$(−1)
FFFF

これはどういうことでしょうか?

メモリマップ

実は8000Hを境にしてマイナスになります。しかも、カウントアップされていきます。

次の命令を実行してみてください。

HEX$(&H10000)
OverFlow
Ok
となりますが、

HEX$(&HFFFF+1)

Ok
となります。

? &HD400
-11264

となります。だから、VPEEK(−1234)などがあるわけです。

&H0000から&HD400までFOR文で指定。

 このように&H8000を越える計算の場合 はどのようにすればよいでしょうか?
まず、0から7FFFまでが整数、&H800までが小数点になっていますから


・&H8000から&HD400までの差を出す。負の数ですから逆転します。

&HD4000-&H8000という式ができる。

・&H8000が負の数になるので&H7FFFに+1を加えます。

よってアドレスは

AD=(&HD400−&H8000)+&H7FFF+1

となります。

このようにFFFFHを半分にすると8000Hになり
このバイアスの数値から符号化して-11264というような表現をイクセス表現を使えば
若干はメモリを節約できることになります。
これは浮動小数点演算と同じようなところです。

論理演算(ロジカルオペレーション)とビット計算

ビットの読み方は1(いち)と(0)です。100(イチゼロゼロ)と読みましょう。
ビット計算からやってみます。ビットを左シフトしてみます。

0001=1
0010=2
0100=4
1000=8

とか

00011=3
00110=6
01100=12
11000=24

となります。
このように2のかけ算ができます。

00と01は0+1ですから、01です。1+1は繰り上がって1になります。

00
01
--
01

となります。

0100
0110
----
1010

となります。

 AND、ORなど文字列ではIF文によく使われる、
これを数式につかうのがビットマスクという2進数いわゆる10(イチゼロ)をマスクすることです。
 ではどのように使うのか?ちょっと例を作ってみる。

0010これをA
0110これをB

これにマスクをかけたとする

0010

となる。

数式にすると

C=A AND B

となります。プログラムしてみると

A=&B10110110:B=&B00111100:C=CANDB:PRINTBIN$(C)

この赤の部分の演算子を論理演算子という。ORに変えてみるとまた違う結果がでてくる。


OR 

0100
0010
----
0110

AND 

0100
0010
----
0000

XOR 

0100
0010
----
1001

NotのOR(NOR)などはORが0110の場合、1001に反転する。

10 SCREEN5
20 LINE(0,0)-STEP(50,50),15,B:LINE(25,0)-STEP(0,50),15
30 LINE(0,60)-STEP(50,50),15,B:LINE(0,60+25)-STEP(50,0),15
20 I$=INPUT$(1)
30 COPY(0,0)-(50,50)TO(0,60),,XOR
60 I$=INPUT$(1)

上の画像は□に縦線、横線を描いたものです。30行は論理演算のXORをやっています。
この演算が実行されるとコピー先の色が周辺色になり、十字が灰色になります。
 COPY命令でTORなどがある場合、透明色のカラーコード0の場合は0の論理演算は行いません。
式はTORを指定した場合<背景色>OR<指定色>になります。
 さて、論理演算って何に使うの?と、思ってしまいますが、
グラフィックは反転表示、合成などで、一般にはORでフラグを入れて、XORでフラグを外してという具合。
本格的にアプリを作ってフラグとかに使えそうですが、何ビット目が何のフラグかという表でも
 作る必要があります。
でも、ここには0以外書き込まないと入れると、「おおっ!」と、ウケルかも。
要するに何かと何かをすると何になるという条件判定です^^;
例えばシフトと論理演算を使えばマシン語のインクリメント(+1)ができます。
01
01
--
10
1と1でANDにならないまでシフトして1。これで2ができます。10
10
01
--
11
0と1で1、これで3ができます。
011
001
--
100
1と1でANDにならないまでシフトして1。これで4ができます。
100
001
---
101
0と1で1、これで5ができます。
101
001
---
110
1と1はANDにならないまでシフト、1と0で1です。これで6ができます。
ここで解ったことは
1と1ではANDにならないまでシフトして0と1になれば1が入り処理が終わります。

パソコンというのは学校の数学と違って、数式などで何でもできるようになります。
1+1は2ではなくて、1+1は3とか実際はありえない数を定義する事もあります。
1+1+0=3とすればヒントでしょうか。

かけ算はたし算を数回計算するより、かけ算はビットで筆算をすると効率がよいようです。

参考文献:
コンピュータはなぜ動くのか


戻る