質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • VB

    309questions

    VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VisualBasic 文字列の中に文字を追加するには

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,889

Strauss

score 24

お久しぶりです。以前VBにて電卓を作っていたものです。

現在機能を追加しているところでして、
・計算経過ディスプレイ
・24桁まで対応
・関数電卓化
上記の上2つはできました。

ただ、現在関数電卓化の階乗のところで処理をどうすればいいのか悩んでいます。
なお、この関数の動きはウィンドウズに標準搭載の電卓の動きに準じています。

階乗(n!)のボタンを連続で押すと
「fact(fact(fact(fact(2))))」このような表示になると思いますが、
どのような処理をしたらfact()のかっこの中にfact()を表示されるのでしょうか
ご教授よろしくお願いします。

--追記--
階乗部分のコードです。
If NumberHold = "C" Then
            NumberHold = FactValue
        Else
            'NumberHoldにある数値を維持
        End If
        DisplayPassage.Text = String.Format("fact({0})", DisplayPassage.Text)
NumberHoldというのは階乗をする数字を記憶する変数です。
初期値だった場合に数字を記憶し、初期値でない場合はその状態を維持します。
現在上記のコードだと計算経過のディスプレイには
fact(fact(fact(fact(fact(fact())))))というように表示できるようになりました。
これをfact(fact(fact(fact(fact(5)))))というようにするにはどうしたらよいでしょうか?        
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

0

fact(x)の状態も退避したほうが良さそうですね。
以下のような感じでフォーマット後の値を毎回退避しましょう。

で連続で押された場合は除去してから追記する感じで

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim tmpFact = String.Format("fact({0})", strPreInput)
    Dim posPre = TextBox1.Text.LastIndexOf(strPreInput)
    If posPre = TextBox1.Text.Length - strPreInput.Length Then
        '前回入力していれば消す
        TextBox1.Text = TextBox1.Text.Remove(posPre, strPreInput.Length)
    End If
    TextBox1.Text += tmpFact
    strPreInput = tmpFact
End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは。

String.Formatを使用します。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    TextBox1.Text = String.Format("fact({0})", TextBox1.Text)
End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/30 15:23 編集

    ご丁寧にありがとうございます。fact()のかっこの中身をボタンを押したときの数字をつけたいのですが、その場合どうすればよろしいでしょうか?"fact("+NumberHold(階乗したい数値)+")"←のように書いた場合エラーでおこられてしまいました。

    キャンセル

  • 2015/06/30 15:28

    Windowsの電卓からすると数字→n!キー以外は上書きされているようですが、それはさて置き、怒られるとはどのように怒られますか。数値型ですよーって感じでしょうか。それならばNumberHold.ToString()で文字列として扱ってください。

    キャンセル

  • 2015/06/30 15:39

    お返事ありがとうございます。インデックス (0 ベース) は 0 以上で、引数リストのサイズよりも小さくなければなりません。というエラーが出てしまします。

    キャンセル

  • 2015/06/30 15:42

    理解力が乏しくすみません。状況がわからなくなってきたので質問へ現在のコードを追記して頂いても良いでしょうか。

    キャンセル

  • 2015/06/30 15:46

    こちらこそわかりにくく書いてしまい申し訳ございません。すぐ載せますので少々お待ちください。

    キャンセル

  • 2015/06/30 15:59

    追記頂いた例だとNumberHoldに"5"(文字列)が入っているということですか?であれば、DisplayPassage.Text = String.Format("fact({0})", NumberHold)になりますが。一度n!キーを押すとNumberHold変数の中身はどうなりますか。

    キャンセル

  • 2015/06/30 16:08

    0の場所にNumberHoldと書くとfact(fact(fact()))…という風にはならず、例:5を押してから階乗ボタンを押すと fact(5)と表示されます。何回押してもfact(fact(fact(5)))と増えません。

    キャンセル

  • 2015/06/30 16:10 編集

    質問に答えていませんでした。数字ボタンを押してからn!ボタンを押すとNumberHoldにはその階乗された元の数字が記録されます。2回目以降はNumberHoldはそのままの状態を維持します。

    キャンセル

  • 2015/06/30 16:15

    NumberHoldに何故退避しているのかによりますが、退避する必要あるのでしょうか。
    数字キーが押された時点でDisplayPassage.Textへ数字を設定しておけば、String.Format("fact({0})", DisplayPassage.Text)で済みそうな気がしますが

    キャンセル

  • 2015/06/30 16:32

    Windowsの標準電卓を基に製作しており、数字ボタン+四則の演算子 を押すことで計算経過を表示されているのでそれに準じて作成しています。退避している理由として、数字ボタンを押したときに計算経過のディスプレイに表示しないためなのと、演算子を押したときに一緒に出すためです。

    キャンセル

  • 2015/06/30 17:00

    成程、よくわかりました。
    別回答しました。

    キャンセル

0

色々方法があると思いますが、これでどうでしょう。
Dim calcStr as string

calcStr = String.Format("fact({0})", 2)
calcStr = String.Format("fact({0})", calcStr)
calcStr = String.Format("fact({0})", calcStr)
calcStr = String.Format("fact({0})", calcStr)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

各変数の意味が掴みきれていませんが、やりたいのはこんなことでしょうか?

        If NumberHold = "C" Then   '←初回判定と推測しました
            NumberHold = FactValue
            DisplayPassage.Text = NumberHold .ToString()   '初回から数値を含めた状態で"fact()"で括る
        Else
            'NumberHoldにある数値を維持
        End If
        DisplayPassage.Text = String.Format("fact({0})", DisplayPassage.Text)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

同じタグがついた質問を見る

  • VB

    309questions

    VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。