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

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

ただいまの
回答率

87.38%

VBScriptのFor文について

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,049

score 31

再投稿です。
このコードの説明をお願いします。
特にiが演算子に来る理由を知りたいです。



B = Inputbox("式を入力してください。")


Y = Len(B)
i = 0


For i = 0 To Y - 1
 A(i) = Mid(B,i+1,1)

 z = i + 1
 For j = 0 To i - 1 
  x = CStr(x) + CStr(A(j))
  
 Next

Next


For k = z To Y - 1
 X2 = CStr(X2) + CStr(A(k))
Next

ans = CDbl(x) + CDbl(X2)
MsgBox"答えは"&CDbl(ans)&"です",,"答え"
End If

例 B=11+11の場合
まず、for文、Len関数、Mid関数でBの文字(数字だけど文字扱い)を一つの文字にして、配列に入れる。

B = Inputbox("式を入力してください。")


Y = Len(B)
i = 0


For i = 0 To Y - 1
 A(i) = Mid(B,i+1,1)


次に、切り取った文字で0から演算子(この場合は+)までを計算
 
z = i + 1
For j = 0 To i - 1 ※よくわからにのはここ。iが演算子にくるから0~i-1で左側 の計算が成立する部分。(そういう風に説明されました)
そもそもなんで、iが演算子の場所に来るかがわからな い。
  
x = CStr(x) + CStr(A(j)) これで、文字列を統合し11になる
   Next
 Next Nextをここに二つ持ってくる意味もわからない


次に左側の計算をする。

For k = z To Y - 1 ※zはi+1をして、演算子の一つ右側になる らしい。
 X2 = CStr(X2) + CStr(A(k)) Y-1で右側の計算が成立するのもよくわ からない
右側の文字列も統合
Next


出た答えを数字に直し足し算。
ans = CDbl(x) + CDbl(X2)
MsgBox"答えは"&CDbl(ans)&"です",,"答え"

この場合だと、答えは33になる
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • takito

    2015/07/06 12:37

    前回から拝見していますが、今回も謎が多いです・・・
    ・課題の内容
    ・このプログラムの入力と出力の例
    をもう少し書けませんか?

    察するに「 12+45 を入力したら 答えは37です と出力される 」ことを期待してるのかなと思いますが、いかがでしょう?

    このプログラムの目的が見えなければ、変数の意味も、それがどう処理されることが適切かもわからないので、思った通りのアドバイスは得られないと思います

    キャンセル

  • piyotaka

    2015/07/06 12:58

    現在は電卓を製作中です。こういうやり方でやりたいのでご教授お願いします。

    キャンセル

回答 3

+7

説明の追加ありがとうございました。だいぶ内容が理解できました。

このコードを見た人たちがみな混乱したように、質問者様も混乱されていることがよくわかりました。
質問者様の指摘は至極まっとうで、疑問を持つ点として正しいです。

ひょっとして、全体はこんな感じじゃないですかね。
これなら理解できそうでしょうか?

Dim B As String
Dim X As String
Dim X2 As String
Dim i As Integer
Dim Y As Integer
Dim Z As Integer
Dim ans As Double
Dim A() As String

B = InputBox("式を入力してください。")

Y = Len(B)

ReDim A(0 To Y - 1)

For i = 0 To Y - 1
  A(i) = Mid(B, i + 1, 1)
  If A(i) = "+" Then
    Z = i + 1
    For j = 0 To i - 1
      X = CStr(X) + CStr(A(j))
    Next
  End If
Next

For i = Z To Y - 1
  X2 = CStr(X2) + CStr(A(i))
Next

ans = CDbl(X) + CDbl(X2)
MsgBox B & " の答えは " & ans & " です", , "答え"

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/10 11:15

    もう一つ質問です。

    元々入力された数値を引いて、変数に入れてから処理をする方法を考えたんですが、
    これも上手くいきません。何故でしょうか?


    B = Inputbox("式を入力してください。"&vbCr&_
    vbCr&_
    "※『=』は必要ありません。"&vbCr&_
    "掛け算は『*』、割り算は『/』を使用してください。","数式の入力")


    Y = Len(B)
    i = 0

    For i = 0 To Y - 1
    A(i) = Mid(B,i+1,1)

    If InStr(A(i),"+") Or InStr(A(i),"-") Or InStr(A(i),"*") Or InStr(A(i),"/") Then



    For j = 0 To i - 1

    x = CStr(x) + CStr(A(j))

    Next

    Exit For

    End If

    Next


    S1 = StrReverse(B)


    For KILL = 0 To Y - 1
    A(KILL) = Mid(S1,KILL+1,1)


    If InStr(A(KILL),"+") Or InStr(A(KILL),"-") Or InStr(A(KILL),"*") Or InStr(A(KILL),"/") Then

    For S2 = 0 To KILL - 1


    AN1 = CStr(AN1) + CStr(A(S2))


    Next

    Exit For

    End If

    Next

    z = i + 1
    S5 = KILL + 1

    KO2 = StrReverse(S1)
    AN2 = StrReverse(AN1)

    'KO2 = B

    F1 = CDbl(KO2) - CDbl(x)

    F2 = CDbl(F1) - CDbl(AN2)


    For F3 = 0 To Y - 1
    A(F3) = Mid(F2,F3+1,1)

    If InStr(A(F3),"+") Then
    F6 = F3 + 1

    For F4 = 0 To F3 - 1


    F5 = CStr(F5) + CStr(F4)

    Next

    Exit For

    End If

    Next



    For F7 = F6 To Y - 1
    F8 = CStr(F8) + CStr(A(F7))

    Next



    If InStr(B,"+") Then
    MsgBox "x=" &x& "AN2=" &AN2& "F5=" &F5& "F8=" &F8 ' 計算値の表示
    ans = CDbl(x) + CDbl(AN2) + CDbl(F5) + CDbl(F8)
    MsgBox"答えは"&ans&"です",,"答え"
    End If

    キャンセル

  • 2015/07/10 13:52

    >1-1-1が1+1-1として処理される理由

    そのパターンならうまくいきそうですけど
    問題ある箇所といえば
    For KILL = 0 To Y - 1
    A(KILL) = Mid(S1,KILL+1,1)
    この部分ですね
    最初の処理で配列Aを使っていますが、この処理によって Bの文字列を逆順 で Aの先頭から 代入しています
    それなのに、最後のIF文で式のパターン振り分けをするときは配列Aには 入力した通りの式の文字が入っている ことを期待してしまっています

    案としては、Bの末尾から処理する時はA2など別の配列を準備してはいかがでしょう?


    > 元々入力された数値を引いて、変数に入れてから処理をする方法

    F1 = CDbl(KO2) - CDbl(x)
    F2 = CDbl(F1) - CDbl(AN2)

    この2つの式は、F1 と F2 がどんな中身になることを期待していますか?

    コメントに書かれているように 'KO2 = B ですから
    つまり CDbl(B) と同じということは、動かなそうですよね・・・

    用意した変数の型、用途、今入っている値が何を意味しているか、もっとよく意識しましょう

    キャンセル

  • 2015/07/12 21:19

    度々、申し訳ないです。お力添えを頂けると助かります

    下記のUKEに上手く代入されない理由を知りたいです。

    IF文の中のCUTが上手く行ってないのはわかるんですが、理由がよくわからないです…。

    B = Inputbox("式を入力してください。"&vbCr&_
    vbCr&_
    "※『=』は必要ありません。"&vbCr&_
    "掛け算は『*』、割り算は『/』を使用してください。","数式の入力")


    Y = Len(B)
    i = 0

    For i = 0 To Y - 1
    A(i) = Mid(B,i+1,1)

    If InStr(A(i),"+") Or InStr(A(i),"-") Or InStr(A(i),"*") Or InStr(A(i),"/") Then



    For j = 0 To i - 1

    x = CStr(x) + CStr(A(j))

    Next

    Exit For

    End If

    Next


    S1 = StrReverse(B)


    For KILL = 0 To Y - 1
    A2(KILL) = Mid(S1,KILL+1,1)


    If InStr(A2(KILL),"+") Or InStr(A2(KILL),"-") Or InStr(A2(KILL),"*") Or InStr(A2(KILL),"/") Then

    For S2 = 0 To KILL - 1


    AN1 = CStr(AN1) + CStr(A2(S2))


    Next

    Exit For

    End If

    Next

    z = i + 1
    S5 = KILL + 1

    KO2 = StrReverse(S1)
    AN2 = StrReverse(AN1)


    'F1 = Mid(KO2,z+1,Y-Z-S5)



    CUT = 0

    For CUT = z To Y-Z-S5
    A3(CUT) = Mid(KO2,z+1,Y-Z-S5)





    If InStr(A3(CUT),"+") Or InStr(A3(CUT),"-") Or InStr(A3(CUT),"*") Or InStr(A3(CUT),"/") Then
    CUT2 = CUT + 1

    For T1 = z To CUT - 1


    UKE = CStr(UKE) + CStr(A3(T1))


    Next

    Exit For

    End If

    Next
    Y2 = Len(A3(CUT))
    For T2 = CUT2 To Y2 - 1

    UKE2 = CStr(UKE2) + CStr(A4(T2))

    Next



    If (A(i)) = "+" And (A2(KILL)) = "+" And (A3(CUT)) = "+" And (A4(T2)) = "+" Then

    ans = CDbl(x) + CDbl(UKE) + CDbl(UKE2) + CDbl(AN2)
    MsgBox "答えは"&ans&"です",,"答え"
    MsgBox "++"
    WScript.Quit
    End If

    MsgBox "x="&x
    MsgBox "UKE="&UKE
    MsgBox "UKE2="&UKE2
    MsgBox "AN2="&AN2
    MsgBox "F1="&F1
    MsgBox "Y2="&Y2
    MsgBox "A3(CUT)="&A3(CUT)
    MsgBox "A3(T1)="&A3(T1)
    MsgBox "CUT="&CUT
    MsgBox "KILL="&KILL
    MsgBox "i="&i
    MsgBox "T1="&T1

    キャンセル

0

動かない(文法エラーの)コードを載せて、意味を説明して欲しいと言われても無理です。
動くコードを、入力データ例と伴に載せてください。

あと、
特にiが演算子に来る
といいうのは何のことを指していますか?iは演算子じゃないのですが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

コメントの流れから
最終的に演算子2つ以上、加減乗除混合の計算をしたいのだと思います。
その場合、演算子の優先順位も考慮しなくてはならず(1 + 2*3 = 7のような)、
ちゃんとした計算結果を返すアルゴリズムを考えるのは常人にはつらいです。

で、世の中には電卓ソフトがあるので、
わざわざ自分で考えなくても当然そういうアルゴリズムがあります。
たいてい普通の数式(中置記法)を「逆ポーランド記法」に変換して計算しているはずです。
中置記法から逆ポーランド記法への変換は「操車場アルゴリズム」というものが有ります。

というわけで、最終的には
1.入力を受け取り、
2.処理しやすいように逆ポーランド記法に変換し、
3.変換結果を元に計算し、
4.計算結果を表示する。
となると思います。

これの実現には、
1.逆ポーランド記法に変換するプログラムを作る
2.逆ポーランド記法を受け取って計算するプログラムを作る
3.2つを合わせる
という段階を踏むといいと思います。

(まあ自分で組まなくてもvbsならEval関数で計算したい文字列を突っ込めば計算結果を返してくれますが)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 87.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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