初めてのプログラム 6日目 SmallBASICでべき乗計算

2010/4/2 読まれた回数791
このエントリーを含むはてなブックマーク |  このページを Google Bookmarks に追加 | Yahoo!ブックマークに登録 | このエントリの Delicious history

初めてのプログラムシリーズも残すところ今回含めてあと2回
6日目は繰り返し処理について、長いけれど大切なところ
初めてのプログラム 5日目 SmallBASICで作った電卓プログラムを改良して整数のべき乗計算が出来るようにするよ

べき乗は5の3乗なら1*5x5x5と1に5を3回かけ、5の-3乗なら1/5/5/5と1に5を3回割る計算を行う計算のこと。

SmallBasicを起動したら
昨日保存した5_Dentakuを開いて、
名前を付けて保存で「6_Bekijo」で保存する。

繰り返しはWhileかForを使って行う。
5日目の電卓プログラムではGoTo文を使って=が押されるまで繰り返し計算を行っていたけれど、これはあんまり良くない方法。
まずはこれをWhileに変える。

While


Whileは次のように書く
While 条件
繰り返す処理
EndWhile

条件に一致している間中、While〜EndWhile間の処理が繰り返される。
もし、無条件に繰り返したい場合は、条件を"True"とする。

ループの開始点をラベルからWhileに変更する。

変更前

ReStart:


変更後

While "True"


ループの終了地点をGoToからEndWhileに変更する。
変更前

Goto ReStart


変更後

EndWhile


これで実行すると、GoToを使わなくても、繰り返し処理が実行できる。

Whileに条件を付けてみる
While では条件に"True"を指定して無条件にループを行い、途中のGoTo文でループを抜けているけれど
Whileに繰り返し条件を設定することでGoToを使わずにループから抜けることが出来る。
計算方法(f)が=以外の場合繰り返すので、繰り返し条件は
f <> "="

変更前

While "True"


変更後

While f <> "="

に変更する。

繰り返しの終了判定をWhileで出来るようになるので
GoToと飛び先のラベルは消してしまう。

削除

If f = "=" Then
Goto Equal
EndIf

削除

Equal:


実行すると一見上手く動いているように見えるけれど、=を押した後に「計算する値を入れてね」と「計算できないです。」が表示されてしまう。
これは、While条件が判断されるのは処理がWhileに来たときだけのため、

f = TextWindow.Read()

実行時に=が入力されても、そこからEndWhileまでの間の

TextWindow.WriteLine("計算する値を入れてね")
y = TextWindow.ReadNumber()
If f="+" Then
a = x + y
TextWindow.WriteLine(x + "+" + y + "=" + a)
ElseIf f="-" Then
a = x - y
TextWindow.WriteLine(x + "-" + y + "=" + a)
ElseIf f="*" Then
a = x * y
TextWindow.WriteLine(x + "*" + y + "=" + a)
ElseIf f="/" Then
a = x / y
TextWindow.WriteLine(x + "/" + y + "=" + a)
Else
TextWindow.WriteLine("計算できないです")
EndIf
x=a

が実行されてしまったため

fに"="以外が入力されたときだけ、処理を行うように
If f <> "=" Then

EndIf
でかこむ

If f <> "=" Then
TextWindow.WriteLine("計算する値を入れてね")
y = TextWindow.ReadNumber()
If f="+" Then
a = x + y
TextWindow.WriteLine(x + "+" + y + "=" + a)
ElseIf f="-" Then
a = x - y
TextWindow.WriteLine(x + "-" + y + "=" + a)
ElseIf f="*" Then
a = x * y
TextWindow.WriteLine(x + "*" + y + "=" + a)
ElseIf f="/" Then
a = x / y
TextWindow.WriteLine(x + "/" + y + "=" + a)
Else
TextWindow.WriteLine("計算できないです")
EndIf
x=a
EndIf


ココまでの全文は次の通り

TextWindow.WriteLine("元の値を入れてね")
x = TextWindow.ReadNumber()
a = x
While f <> "="
 TextWindow.WriteLine("計算する方法を選んでね [+ - * / =]")
 f = TextWindow.Read()
 If f <> "=" Then
  TextWindow.WriteLine("計算する値を入れてね")
  y = TextWindow.ReadNumber()
  If f="+" Then
   a = x + y
   TextWindow.WriteLine(x + "+" + y + "=" + a)
  ElseIf f="-" Then
   a = x - y
   TextWindow.WriteLine(x + "-" + y + "=" + a)
  ElseIf f="*" Then
   a = x * y
   TextWindow.WriteLine(x + "*" + y + "=" + a)
  ElseIf f="/" Then
   a = x / y
   TextWindow.WriteLine(x + "/" + y + "=" + a)
  Else
   TextWindow.WriteLine("計算できないです")
  EndIf
  x=a
 EndIf
EndWhile
TextWindow.WriteLine("計算結果は" + a + "です。")


For


もう一つの繰り返し、Forを使って計算する方法に「^」が押されるとべき乗計算を行うようにする。

TextWindow.WriteLine("計算する方法を選んでね [+ - * / =]")
に^を加えて


TextWindow.WriteLine("計算する方法を選んでね [+ - * / ^ =]")

に変更する。

Forは
For 変数 = 初期化 To 終点 Step 変数の増分値
繰り返す処理
EndFor
と書く。

例えば
For i = 1 To 2 Step 1
繰り返す処理
EndFor
とすると、最初にForに入ったときにiに1が代入される。
1回目の処理が終わってEndForに来ると、Forに戻ってiに増分値(1)が足されて2になる。
2回目の処理が終わるとiにまた増分値(1)が足されて3になる。
3は終点を越えているので、繰り返しから抜ける。

複数の処理を一度に行うので複雑だけれど、分解すると次の通りになる。
i=1
Loop:
If i > 2 Then
GoTo EndLoop
EndIf
繰り返す処理
i = i + 1
GoTo Loop
EndLoop:

増分値に-の値を入れると初期値から変数が減っていき終点の数より減るまでの間繰り返される。
For i = 0 To -2 Step -1
繰り返す処理
EndFor
1回目の処理が終わってEndForに来ると、Forに戻ってiに増分値(-1)が足されて-1になる。
2回目の処理で-2に3回目の処理で-3となり、-3は終点を越えているので、繰り返しから抜ける。

実際に使うときはStep 増分値は省略されることが多く、省略した場合はStep 1を指定したことと同じになる。

べき乗計算を作ってみる。

ElseIf f="/" Then
a = x / y
TextWindow.WriteLine(x + "/" + y + "=" + a)

の下に^が入力された場合の処理を追加する。

ElseIf f="^" Then

べき乗は、指数(y)の値が正の数の場合は1に基数(x)の値を指数回掛けて求めるので

If y >= 0 Then
a = 1
For i = 1 To y
a = a * x
EndLoop
End IF
TextWindow.WriteLine(x + "^" + y + "=" + a)


指数が負の数の場合は1に基数の値を指数回割って求めるので

If y >= 0 Then
a = 1
For i = 1 To y
a = a * x
EndLoop
Else
a = 1
For i = -1 To y step -1
a= a / x
EndFor
End IF
TextWindow.WriteLine(x + "^" + y + "=" + a)


プログラム全体は次の通り


TextWindow.WriteLine("元の値を入れてね")
x = TextWindow.ReadNumber()
a = x
While f <> "="
TextWindow.WriteLine("計算する方法を選んでね [+ - * / ^ =]")
f = TextWindow.Read()
If f <> "=" Then
TextWindow.WriteLine("計算する値を入れてね")
y = TextWindow.ReadNumber()
If f="+" Then
a = x + y
TextWindow.WriteLine(x + "+" + y + "=" + a)
ElseIf f="-" Then
a = x - y
TextWindow.WriteLine(x + "-" + y + "=" + a)
ElseIf f="*" Then
a = x * y
TextWindow.WriteLine(x + "*" + y + "=" + a)
ElseIf f="/" Then
a = x / y
TextWindow.WriteLine(x + "/" + y + "=" + a)
ElseIf f="^" Then
If y >= 0 Then
a = 1
For i = 1 To y
a= a * x
EndFor
Else
a = 1
For i = -1 To y step -1
a= a / x
EndFor
EndIf
TextWindow.WriteLine(x + "^" + y + "=" + a)
Else
TextWindow.WriteLine("計算できないです")
EndIf
x=a
EndIf
EndWhile
TextWindow.WriteLine("計算結果は" + a + "です。")



入力し終わったらプログラムを実行してべき乗計算できることを確認して保存しよう。


繰り返し処理はIf文とGoToをつかえばForやWhileが無くても作ることが出来る。
それでもForやWhileがあるのには理由があって、
繰り返し処理はよく使うのに、難しくて、しかも、失敗すると被害が大きく
プログラマーが楽しつつミスをしにくいように、これだけの手段が出来てる。

特に、終了条件が訪れない状態を無限ループといい、プログラムが反応しなくなってしまう。
無限ループの例 赤の×を押すか「プログラムの終了」を押すまで動き続ける。

i=1
label1:
If i=0 Then
GoTo label2
EndIf
TextWindow.WriteLine(i)
i = i + 1
GoTo label1
label2:

GoTo文はループしている事や終了条件が見えづらいので、無限ループに陥りがち、
ForやWhileを上手く使うことでループがすっきりして失敗しにくくなる。

繰り返す回数が決まっている場合はForを使えば
For i = 1 To 繰り返したい回数
 繰り返す処理
EndFor
とするだけなので簡単で間違いが起きにくい。

繰り返す回数が決まっておらず繰り返している処理の中で条件を求める場合はWhileを使うと繰り返す範囲とその条件がまとまるので見やすくなる。

同じループをForとWhileとGoToで作ってみる。Forが一番シンプルで、次にWhile、
GoToはループしている事すら見えづらくなっているのが分かると思う。
For

For i = 1 To 5
TextWindow.WriteLine(i)
EndFor

While

i = 1
While i <= 5
TextWindow.WriteLine(i)
i = i + 1
EndWhile

GoTo

i = 1
label1:
If i > 5 Then
GoTo label2
EndIf
TextWindow.WriteLine(i)
i = i + 1
GoTo label1
label2:


地味だった初めてのプログラムも次回で最後の予定です。
次回は配列についてを行う予定。
その後は絵を描いたりゲームを作ったりもっと派手で面白いプログラムを作っていこうかと思います。

初めてのプログラム 7日目 完成電卓プログラム

関連キーワード

[簡易言語][SmallBasic]

コメントを投稿する

名前URI
コメント

トラックバック URL(β)

初めてのプログラム 5日目 SmallBASICで電卓プログラム

2010/3/29 読まれた回数1030
このエントリーを含むはてなブックマーク |  このページを Google Bookmarks に追加 | Yahoo!ブックマークに登録 | このエントリの Delicious history

5日目はGoTo文について
初めてのプログラム 4日目 SmallBASICで四則演算プログラムを改良して繰り返し計算が出来るようにするよ
今までプログラムは上から下に流れて終わるだけだったけれど
GoTo文を使うと、プログラムの処理を好きな場所へ飛ばすことが出来る。

SmallBasicを起動したら
昨日保存した4_Shisokuを開いて、
名前を付けて保存で「5_Dentaku」で保存する。

+-*/に=を加えて=が押されるまで計算する方法を選ぶ処理に戻るようにする。
戻る場所を指定するには戻る位置にラベルをセットする。
ラベルのセットの仕方は
ラベル名に続いてコロン「:」を入力する。

今回は計算する方法を選んでね、の直前に戻したいので


TextWindow.WriteLine("計算する方法を選んでね [+ - * /]")

の前にラベルを追加する。
ついでに、計算する方法に[=}も追加しておこう

ReStart:
TextWindow.WriteLine("計算する方法を選んでね [+ - * / =]")


ReStartに戻る処理を追加する。
計算を行ったら計算結果を元の値に代入する処理を追加する。
プログラムの最後に

x=a

をセットする。

このままだと、計算する方法におかしな値が入ってきた場合や、いきなり=を押した場合
aに値が入らないので、xを入力時にaにも同じ値を代入するようにする

x = TextWindow.ReadNumber()

の下に

a=x

を追加する。


計算後ReStartに戻るので
プログラムの最後に

GoTo Restart

を追加する。


次に=を押した処理の追加する。
=が押されると計算結果を表示してプログラムを終了するようにする。

プログラムの最後に=が押されたときに飛ぶラベルを追加して計算結果を表示するようにしよう。
ラベル名はEqualにする。

プログラムの最後に

Equal:
TextWindow.WriteLine("計算結果は" + a + "です。")

を追加する。

=が押されたときだけEqualへ飛ぶ処理を追加するのでif文を使う。

TextWindow.WriteLine("計算する方法を選んでね [+ - * /]")
f = TextWindow.Read()

の下に

If f = "=" Then
Goto Equal
EndIf

を追加する。

プログラム全体は次の通り


TextWindow.WriteLine("元の値を入れてね")
x = TextWindow.ReadNumber()
a = x
ReStart:
TextWindow.WriteLine("計算する方法を選んでね [+ - * / =]")
f = TextWindow.Read()
If f = "=" Then
Goto Equal
EndIf
TextWindow.WriteLine("計算する値を入れてね")
y = TextWindow.ReadNumber()
If f="+" Then
a = x + y
TextWindow.WriteLine(x + "+" + y + "=" + a)
ElseIf f="-" Then
a = x - y
TextWindow.WriteLine(x + "-" + y + "=" + a)
ElseIf f="*" Then
a = x * y
TextWindow.WriteLine(x + "*" + y + "=" + a)
ElseIf f="/" Then
a = x / y
TextWindow.WriteLine(x + "/" + y + "=" + a)
Else
TextWindow.WriteLine("計算できないです")
EndIf
x=a
Goto ReStart
Equal:
TextWindow.WriteLine("計算結果は" + a + "です。")


入力し終わったらプログラムを実行して繰り返し計算できること
=を押すと計算結果が表示されてプログラムが終了できることを確認しよう


初めてのプログラム 6日目 SmallBASICでべき乗計算

関連キーワード

[簡易言語][SmallBasic]

コメントを投稿する

名前URI
コメント

トラックバック URL(β)

初めてのプログラム 4日目 SmallBASICで四則演算プログラム

2010/3/23 読まれた回数1115
このエントリーを含むはてなブックマーク |  このページを Google Bookmarks に追加 | Yahoo!ブックマークに登録 | このエントリの Delicious history

4日目はif文について
昨日作った挨拶プログラムを改良して引き算やかけ算等も出来るようにするよ

SmallBasicを起動したら
昨日保存した3_Tashizanを開いて、
名前を付けて保存で「4_Shisoku」で保存する。

どの計算をするかを選んでもらうために


TextWindow.WriteLine("元の値を入れてね")
x = TextWindow.ReadNumber()



TextWindow.WriteLine("足す値を入れてね")
y = TextWindow.ReadNumber()

の間に計算する記号を入力してもらう処理を追加する。

TextWindow.WriteLine("元の値を入れてね")
x = TextWindow.ReadNumber()
TextWindow.WriteLine("計算する方法を選んでね [+ - * /]")
f = TextWindow.Read()
TextWindow.WriteLine("計算する値を入れてね")
y = TextWindow.ReadNumber()

これでfにどの方法で計算するかがセットされる。

次に入力された内容によって計算方法を切り替える処理を作る。
条件によって処理を切り替えるにはif文を使う。

if文は
If 条件 Then
処理
ElseIf 条件 Then
 処理
Else
 処理
EndIf
と言う風に書く。
If 条件 Thenは
もし、条件に該当する場合だけ処理を行うと言う意味
ElseIf 条件 Thenは
今までの条件に該当せずに、新しい条件に該当する場合だけ処理を行うと言う意味
Elseは
今までの条件に該当しなかった場合に処理を行うと言う意味

例えば
If 条件1 Then
 処理A
ElseIf 条件2 Then
 処理B
ElseIf 条件3 Then
 処理C
Else
 処理D
EndIf
と言う場合、
条件1に該当する場合、処理Aが実行され、
条件1に該当せず、条件2に該当する場合、処理Bが実行される。
条件1、2該当せず、条件3に該当する場合、処理Cが実行される。
条件1、2、3全てに該当しない場合は処理Dが実行される。

ElseIfやElseは省略することも出来る。
If 条件1 Then
 処理A
Else
 処理B
EndIf
とすれば、もし条件1に該当すれば処理Aを実行し、
条件Aに該当しない場合は処理Bを行う。

If 条件1 Then
 処理A
ElseIf 条件2 Then
 処理B
EndIf
とすれば、もし条件1に該当すれば処理Aを実行し、
条件1に該当せず、条件2に該当する場合は処理Bを行い、
条件1,2に該当しない場合は何も処理を行わない。
このif文のことを条件によって処理を分岐することから条件分岐という。

今回はfに入力された値を元に計算を行い、
もし+,-,*,/以外が入力された場合はエラーを表示する処理を作る。

xとyを必ず足し算する処理をfに"+"が入ってきた場合のみ行うようにするには、

a = x + y
TextWindow.WriteLine(x + "+" + y + "=" + a)

をIf文で囲って

If f="+" Then
a = x + y
TextWindow.WriteLine(x + "+" + y + "=" + a)
EndIf

とする。

次に引き算の処理を追加する。
EndIfの前にElseIfを追加して、fが"+"ではなく"-"だった場合に引き算を行う処理を追加する。

If f="+" Then
a = x + y
TextWindow.WriteLine(x + "+" + y + "=" + a)
ElseIf f="-" Then
a = x - y
TextWindow.WriteLine(x + "-" + y + "=" + a)
EndIf

同様に、かけ算、割り算の処理も追加する

If f="+" Then
a = x + y
TextWindow.WriteLine(x + "+" + y + "=" + a)
ElseIf f="-" Then
a = x - y
TextWindow.WriteLine(x + "-" + y + "=" + a)
ElseIf f="*" Then
a = x * y
TextWindow.WriteLine(x + "*" + y + "=" + a)
ElseIf f="/" Then
a = x / y
TextWindow.WriteLine(x + "/" + y + "=" + a)
EndIf


最後にElseを使って+-*/以外が入力されるとエラーとなる処理を追加する。

If f="+" Then
a = x + y
TextWindow.WriteLine(x + "+" + y + "=" + a)
ElseIf f="-" Then
a = x - y
TextWindow.WriteLine(x + "-" + y + "=" + a)
ElseIf f="*" Then
a = x * y
TextWindow.WriteLine(x + "*" + y + "=" + a)
ElseIf f="/" Then
a = x / y
TextWindow.WriteLine(x + "/" + y + "=" + a)
Else
TextWindow.WriteLine("計算できないです")
EndIf



プログラム全体は以下の通り

TextWindow.WriteLine("元の値を入れてね")
x = TextWindow.ReadNumber()
TextWindow.WriteLine("計算する方法を選んでね [+ - * /]")
f = TextWindow.Read()
TextWindow.WriteLine("計算する値を入れてね")
y = TextWindow.ReadNumber()
If f="+" Then
a = x + y
TextWindow.WriteLine(x + "+" + y + "=" + a)
ElseIf f="-" Then
a = x - y
TextWindow.WriteLine(x + "-" + y + "=" + a)
ElseIf f="*" Then
a = x * y
TextWindow.WriteLine(x + "*" + y + "=" + a)
ElseIf f="/" Then
a = x / y
TextWindow.WriteLine(x + "/" + y + "=" + a)
Else
TextWindow.WriteLine("計算できないです")
EndIf

入力し終わったら実行ボタン
+-*/によって計算方法が変わること、
それ以外の値を入れるとエラーとなることを確認したら保存を押してプログラムを保存しよう
初めてのプログラム 5日目 SmallBASICで電卓プログラム

関連キーワード

[簡易言語][SmallBasic]

コメントを投稿する

名前URI
コメント

トラックバック URL(β)

RSSで読むRSSフィードを購読

プロフィール

kenz

新しいものが大好き
仕事ではクラウドをプライベートではAndroidアプリを作ってます。
最近、プログラムしている人が減っているのでSmallBasicの紹介記事でプログラム好きな人が増えてくれたら嬉しい

FriendFeed

日記の一覧

follow me

☆最新コメント

近況報告 
kenz:うん、タイムライン組...

近況報告 
Take:写真をiphotoに...

音楽が異常にいいゲー 
kenz:思った以上に曲数が増...

最近の日記

kenz 9月2日
Apple新製品発表

kensei 8月26日
次の

京 7月28日
postgresでクエリ結果をファイルに書き出し。 (1)

jyun 6月30日
いよいよ福岡へ (1)

あわせて読みたいブログパーツ