textboxに入力した有効桁数で円周率を表示するには?

解決


ゆう  2009-06-29 02:08:11  No: 142119  IP: 192.*.*.*

テキストボックスで入力した桁数まで円周率を表示するプログラムを作成sたいのですが、visualbasicを始めたばかりでまったくわかりません。
詳しい方教えていただけませんか。

編集 削除
魔界の仮面弁士  2009-06-29 02:54:04  No: 142120  IP: 192.*.*.*

お使いの環境を示してください。VB6 と VB.NET では、回答が全く異なってきますし。

さて円周率についてですが、通常は
  pi = 4 * Atn(1)  'VB6
  pi = Math.PI     'VB.NET
を使えば、VB から通常の計算を行う分には十分かと思います。

しかし今回のように、指定桁数までの円周率を出したいのであれば、
  (案1)十分な長さの円周率値を固定値で保持しておき、それを表示する。
  (案2)計算で円周率を求める。
のいずれかという事になるかと思います。

前者の場合には
http://www.kisaragiweb.jp/pi/pi1m.htm
などにある円周率値をテキストファイルなどに保存しておき、
そこから読み取るようにすると良いかと思います。

後者の場合は、計算処理の部分をご自身で作成する事になるでしょうが、
その考え方については、下記の資料が参考になるかと思います。
http://hp.vector.co.jp/authors/VA014765/pi/howto.html

編集 削除
ゆう  2009-06-29 20:17:39  No: 142121  IP: 192.*.*.*

環境はvb2008です。
詳しい解説ありがとうございます。案1も案2もプログラムにするとなると手が付けられません。勉強不足で申し訳ないです。

編集 削除
魔界の仮面弁士  2009-06-30 10:07:45  No: 142122  IP: 192.*.*.*

> 案1も案2もプログラムにするとなると手が付けられません。勉強不足で申し訳ないです。

(1) フォームに、NumericUpDown / TextBox を貼ります。
  NumericUpDown が小数点以下桁数の指定、TextBox が円周率の表示先です。

(2) NumericUpDown のプロパティを、以下のように設定しておきます。
    Maximum = 任意の値
    Minumum = 0
    TextAlign = Right
    ThosandSeparator = True
    Value = 2

(3) TextBox のプロパティを、以下のように設定しておきます。
    Multiline = True  (False のままだと読みにくいので)
    ReadOnly = True
    ScrollBars = Vertical
    Size = 複数行見える程度の高さ
    Text = "3.14"

(4) フォームに、以下のコードを記載します。

Public Class Form1
    Private Const PI As String = "1415926535897932384626433832795028841971693993751058209749445923078164062862"
    Private Sub NumericUpDown1_ValueChanged() Handles NumericUpDown1.ValueChanged
        TextBox1.Text = "3." & Strings.Left(PI, CInt(NumericUpDown1.Value))
    End Sub
End Class


これで完成です。NumericUpDown の数値を▲▼で変更するか、あるいは
数値をキーボードから入力して Enter すると、円周率が表示されます。


NumericUpDown1.Maximum は、定数 PI の最大桁数に合わせておいてください。(上記サンプルでは 76 桁)

なお定数 PI の部分は、先に紹介した http://www.kisaragiweb.jp/pi/pi1m.htm から
「10桁毎の空白」「100桁毎の改行」「5000桁毎の区切り」を除去した数値を割り当てます。

ちなみに、この方法で指定できる最大桁数は、およそ6万5千桁となっています。
というのも、VB2008 では一行あたりのサイズが 65535 桁までに制限されているためです。
ただし、

  Private Const PI As String = "14159…684198" _
  & "41403628727256232144287543022109…833652" _
  & "88654365422483020278924170496896…628036" _
  & "85645159152570329027569036857129…

のように、行継続文字「 _」(半角空白とアンダーバーの組み合わせ)を使って
複数の文字列を連結していく方法を用いれば、より長い文字列値を構築することもできます。

また案1で示したように、このデータを外部ファイルに保持する手法もあります。
この場合、ファイルの読み取りには「System.IO.File.ReadAllText メソッド」を利用できます。

編集 削除
ゆう  2009-06-30 20:42:53  No: 142123  IP: 192.*.*.*

上記通りにしてみたところできました。
魔界の仮面弁士さん、ありがとうございました。
これからもわからないことがあれば、助言お願いいたします。

編集 削除