0から12までの値nを入力し、nと階乗n!の値を表示しなさいという問題

このQ&Aのポイント
  • 0から12までの数値nを入力し、nとその階乗n!の値を計算するプログラムについての質問です。
  • プログラム中で変換エラーが発生しているようです。具体的には、入力された値をLong型に変換する際にエラーが発生しています。
  • このプログラムでは、再帰を用いて階乗を計算しています。引数が1の場合はそのまま返し、それ以外の場合は引数と再帰呼び出しの結果を乗算しています。
回答を見る
  • ベストアンサー

0から12までの値nを入力し、nと階乗n!の値を表示しなさいという問題

0から12までの値nを入力し、nと階乗n!の値を表示しなさいという問題ですが、一つの数字しか計算が出来ません 5と12の場合は String "5 12" から型 'Long' への変換は無効です。と出てきてしまいます。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim n As Long Dim f As Long n = CLng(TextBox1.Text) ←ここにエラーが出ます。 TextBox2.Text = CStr(Recur(n)) End Sub Public Function Recur(ByVal arg As Long) As Long If arg = 1 Then Recur = arg Exit Function End If Recur = arg * Recur(arg - 1) End Function End Class というプログラムです。分かる方よろしくお願いします。 実行エラーです。

質問者が選んだベストアンサー

  • ベストアンサー
  • yaguma
  • ベストアンサー率57% (4/7)
回答No.2

TextBoxに入力された値は、単一の文字列として扱われます。 [5 12]と入力した場合にTextプロパティで取り出せる値は、"5 12"というひとつの文字列です。"5"と"12"のふたつの値を取得することはできません。 なので、数字以外の文字を含む文字列である"5 12"を数値型に変換しようとするとエラーが出てきてしまいます。"5あいうえお12"を数値に変換できないのと一緒です。 複数の入力値を取りたいならば、入力用のTextBoxを複数個用意したり、または入力値をスペースで分割して複数個の値を取り出すコードを実装するなどの工夫が必要です。

hxhqk465
質問者

お礼

ありがとうございます。もう少しなので修正後、また質問しようと思います

その他の回答 (1)

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.1

文字を数字に変更したらどうでしょうか。 n = CLng(Val(TextBox1.Text))

関連するQ&A

  • 0から12までの値nを入力し、nと階乗n!の値を表示しなさいという問題

    0から12までの値nを入力し、nと階乗n!の値を表示しなさいという問題です。 前にこのプログラムで複数個、同時には計算できない問題を自分で解決したのですがこんどは0が計算できないようです。 System.StackOverflowException' のハンドルされていない例外が WindowsApplication1.exe で発生しました。 とでます Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim n As Long Dim f As Long n = CLng(TextBox1.Text) TextBox2.Text = CStr(Recur(n)) End Sub Public Function Recur(ByVal arg As Long) As Long ←ここにエラーが If arg = 1 Then Recur = arg Exit Function End If Recur = arg * Recur(arg - 1) End Function End Class というプログラムです。分かる方よろしくお願いします。 実行エラーです。

  • このコードはどこが間違っていますか?(至急)

    急ぎのため再度の質問失礼します。 (zのn乗)-(xのn乗+yのn乗)の計算をさせて、答えが0のときにメッセージを表示したいのですが、どのようなコードを書けばいいのでしょうか? Option Explicit On Public Class Form1 Dim x As Long Dim y As Long Dim z As Long Dim n As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click x = TextBox1.Text y = TextBox2.Text z = TextBox3.Text n = TextBox4.Text TextBox5.Text = (z ^ n) - (x ^ n + y ^ n) If (TextBox5 .Text= 0) Then Label6.Visible = True End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub Private Sub Label6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label6.Click End Sub End Class このコードだと答えが必ず-1になってしまうのですが、どこを直せばいいのでしょうか? 正しいコードを教えて下さい。 よろしくお願いします。

  • VB初心者です。コードの書き方が分かりません。

    VB初心者です。 VBで(zのn乗)-(xのn乗+yのn乗)の計算が出来るようにしたいのですが、答えが必ず-1になってしまいます。 Option Explicit On Public Class Form1 Dim x As Long Dim y As Long Dim z As Long Dim n As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click TextBox5.Text = (z ^ n) - (x ^ n + y ^ n) End Sub End Class 正しいコードの書き方を教えて下さい。 また特定の答えのときにメッセージを表示したいのですが、どうすればいいですか?

  • 再帰処理を用いて階乗を求めるプログラム

    こんにちは 再帰処理を用いて階乗を求めるプログラムについて の質問です。 以下のように考えたのですが、 まったく駄目なようです。 どこをどのように直したらいいのか いまいちわかりません。 どなたか教えて下さい。お願いします。 Private Sub CommandButton1_Click() Dim n As Integer 階乗する数 Dim f As Integer 階乗する数の階乗した値 n = Val(TextBox1)   Do While f > 1 KEISAN n, f Loop TextBox2 = f End Function Function KEISAN(n, f) If n <= 1 Then f = 1 Else f = n * f(n - 1) End If End Function

  • VB.netでパスワード変更

    下記のようなパスワードを変更するフォームをVB.netで作成したのですが、 実行すると、いつも異なるretValの値がかえってきて変更できません。 retValの値もよくわからない大きな数値がかえってくるのでどのようなエラーかも 判断つかず。 どこが間違っているかお分かりになる方いらっしゃいますでしょうか。 Public Class Form1 Private Declare Function NetUserChangePassword Lib "netapi32.dll" (ByVal Domain As String, ByVal User As String, ByVal OldPass As String, ByVal NewPass As String) As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim retVal As Long Dim sDomain As String Dim sUser As String Dim sOldPass As String Dim sNewPass As String sDomain = "xxxxxxx" ←ここはサーバのIPアドレス sUser = TextBox1.Text sOldPass = TextBox2.Text sNewPass = TextBox3.Text retVal = NetUserChangePassword(sDomain, sUser, sOldPass, sNewPass) MsgBox(retVal) End Sub End Class

  • Formの間に値を渡すことについて

    素人の質問が以下のとおりです。 【Form1の設置:】 TextBox1 Button1 【Form2の設置:】 Label1 【要求:】 1. Form1のTextBox1に値(文字)を入力して、Button1をクリックすれば 2. Form2のLabel1からTextBox1に入力された値(文字)を表示される。   要するFormの間に値を渡すことです。 もちろん、ネットでも調べましたが、説明されたことをよくわからなかったのでシンプルなコードが頂きたいです。 自分が作ったNGものもアップします。 ------------------Form1内に記載した内容------------- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim tmpMsg As String tmpMsg = TextBox1.text   Dim frmFrom1 As New Form1 frmFrom1.Show(tmpMsg) End Sub ---------------------------------------------------- ------------------Form2内に記載した内容------------- Public Class Form3 Private Sub Form2_Load(ByRef tmpMsg As String) Label1.Text = tmpmsg End Sub End Class ---------------------------------------------------- 結果として、エラーがなかったが、label1に何も表示されなかったです。 宜しくお願い致します。^@^

  • VB.NETで素因数分解のプログラムを作成する

    2以上の整数が与えられたとき、それを素数の積に分解するプログラムを作成したいのです。 例えば、TextBox1に24と打ち込んで、Button1をクリックすると、TextBox2に2×2×2×3が表示されるといった具合です。 ↓ここからどうすれば良いか、ご教授お願い致します。 Private Sub IntegerButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim n, a As Integer n = TextBox1.Text Do back: If n Mod 2 = 0 Then n = n Mod 2 = 0 Else n = n Mod 3 = 0 End If GoTo back Loop Until n = n + 1 TextBox2.Text = n & "×" End Sub End Class

  • 順列のプログラムについて(VB)

    下記が、組み合わせを求めるプログラムです。 これのどこを変更すれば、順列を列挙するプログラムになりますか(ただし、重複順列でない。例、5P2=5*4=20通り)?教えていただけませんか? Public Class Form1 Dim w0, w1, count As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Text = "コンビネーションサーチ" Label1.Text = "個の中から" Label2.Text = "個とる組リスト" Button1.Text = "計算" TextBox1.Text = "6" TextBox2.Text = "3" TextBox3.Text = "" TextBox3.ScrollBars = ScrollBars.Vertical count = 0 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim n, m As Integer n = TextBox1.Text m = TextBox2.Text w1 = " }" w0 = "{ " TextBox3.Text = "" count = 0 combisearch(1, n, m) MsgBox("組み合わせ個数は、" & count & "個です。") End Sub Sub combisearch(ByVal st, ByVal ed, ByVal depth) Dim i, temp If depth - 1 < 1 Then For i = st To ed TextBox3.Text &= w0 & i & w1 & vbCrLf count += 1 Next Else For i = st To ed temp = w0 w0 &= i & " " combisearch(i + 1, ed, depth - 1) w0 = temp Next End If End Sub End Class

  • PreviewKeyDownについて

     Form1にButton1とTextBox1、TextBox2、TextBox3を配置します。 TextBox2はMultiLineにします。 プログラムを実行し、1度目は4などを入れ「Enterキー」を押し、間違えます。 TextBox3には「不正解」と表示されます。 次に、textbox2に正解の3を入れ「Enterキー」を押しても「正解」とは表示されません。 私の頭では「正解」と表示されると思うのですが、どこがおかしいのでしょうか。  もう一つ、TextBox2はEnterキーを押したときの「ピン」という警告音が出ないようにMultiLineにしていますが、MultiLineにせず、警告音を消す方法はありますか。宜しくお願いいたします。  以下はコードです。 Dim Problem As String Dim RightAnswer As String Dim Answer As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load problem = "1+2=" RightAnswer = "3" End Sub Private Sub TextBox2_PreviewKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles TextBox2.PreviewKeyDown If e.KeyCode = Keys.Enter Then Answer = Me.TextBox2.Text If Answer = RightAnswer Then Me.TextBox3.Text = "正解" Else Me.TextBox2.Text = "" Me.TextBox3.Text = "不正解" Me.TextBox2.Focus() End If End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.TextBox1.Text = Problem Me.TextBox2.Focus() End Sub

  • cos波表示について マクローリン展開 vb

    下記が、sin波を表示させるためのプログラムです。 これを改良し(mysin→mycosにし、mysin2→mycos2にする。)cos波を表示させたいです。 今、作ってみましたが、変な形です。 どこをどのように改良すればよいか、教えていただけませんでしょうか。 ちなみに、cos波は、picturebox2に作り、button2をクリックしたときに表示させるようにする。 Imports System.Math Public Class Form1 Dim b As Bitmap Dim g As Graphics Dim p As Pen Dim w, h, mw, mmw, mh As Integer Dim b2 As Bitmap Dim g2 As Graphics Dim p2 As Pen Dim w2, h2, mw2, mmw2, mh2 As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Text = "Sin波 Cos波" w = PictureBox1.Width h = PictureBox1.Height w2 = PictureBox2.Width h2 = PictureBox2.Height mw = w \ 2 mmw = mw \ 2 mh = h \ 2 mw2 = w2 \ 2 mmw2 = mw2 \ 2 mh2 = h2 \ 2 Button1.Text = "Sin Curve" Button2.Text = "Cos Curve" b = New Bitmap(w, h) g = Graphics.FromImage(b) p = New Pen(Color.Black, 1) b2 = New Bitmap(w2, h2) g2 = Graphics.FromImage(b2) p2 = New Pen(Color.Black, 1) g.DrawLine(p, 0, mh, w, mh) g.DrawLine(p, mw \ 2, 0, mw \ 2, h) g2.DrawLine(p2, 0, mh2, w2, mh2) g2.DrawLine(p2, mw2 \ 2, 0, mw2 \ 2, h2) p.Dispose() p2.Dispose() PictureBox1.Image = b PictureBox2.Image = b2 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i, k, x0, y0 As Integer p = New Pen(Color.Blue, 2) For i = mw + mmw - w To w - mmw k = mysin(i * PI / 180) * mh * 0.9 x0 = mmw + i y0 = mh - k g.DrawLine(p, x0, y0, x0 + 1, y0 + 1) Next PictureBox1.Image = b End Sub Function mysin(ByVal arg) As Double Dim s = Sign(arg) Dim mp = Int(arg / (2 * PI)) arg = arg - 2 * PI * mp If s < 0 Then arg = 2 * PI - arg If arg > 3 * PI / 2 Then Return -s * mysin2(2 * PI - arg) ElseIf arg > PI Then Return -s * mysin2(arg - PI) ElseIf arg > PI / 2 Then Return s * mysin2(PI - arg) Else Return s * mysin2(arg) End If End Function Function mysin2(ByVal arg) As Double Return arg - Pow(arg, 3) / 6 + Pow(arg, 5) / 120 - Pow(arg, 7) / 5040 End Function Function mycos(ByVal arg2) As Double Dim c = Sign(arg2) Dim mp = Int(arg2 / (2 * PI)) arg2 = arg2 - 2 * PI * mp If c < 0 Then arg2 = -2 * PI - arg2 If arg2 > 3 * PI / 2 Then Return c * mycos2(-2 * PI - arg2) ElseIf arg2 > PI Then Return c * mycos2(arg2 - PI) ElseIf arg2 > PI / 2 Then Return -c * mycos2(PI - arg2) Else Return -c * mycos2(arg2) End If End Function Function mycos2(ByVal arg2) As Double Return 1 - Pow(arg2, 2) / 4 + Pow(arg2, 4) / 24 - Pow(arg2, 6) / 720 End Function Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim j, l, x1, y1 As Integer p2 = New Pen(Color.Red, 2) For j = mw2 - mmw2 - w2 To w2 - mmw2 l = mycos(j * PI / 180) * mh2 x1 = mmw2 + j y1 = mh2 - l g2.DrawLine(p2, x1, y1, x1 + 1, y1 + 1) Next PictureBox2.Image = b2 End Sub End Class

専門家に質問してみよう