- ベストアンサー
VBの問題です
VBの条件判断の応用問題 大学の情報の問題でヒントをもらいやってみたのですがうまくできません。自分でやったものをのせたのでどこがどのように間違えているか指摘してもらえるとありがたいです。 東京都水道局では23区内の水道料金(月額)を水道管の口径(以下で呼び径と記述)と月の水道使用料により、次の表に基づいて計算する。水道管の呼び径の番号と水道使用量を性数値で入力すると、次表と計算式に従い、次のページの仕様を満たす水道料金計算のプログラムを作れ。 申し訳ないのですが 表をのせられなかったのでこちらから参照してください http://www.waterworks.metro.tokyo.jp/life/r_keisan.htm 水道料金一か月の表の一般用の部分です 計算式 (基本料金+従量料金)*1.05(1円未満の端数は切り捨て) 【プログラムの仕様】 1.呼び径は(1)13mm、(2)20mm、・・・(12)300mm以上の中から該当する番号を、水道使用量は㎥単位で整数値を、どちらもInputbox関数で取得する。呼び径番号取得ではInputboxに番号と呼び径の対応関係を表示せよ。この際、表示文字列を複数部分に分割して、行末を文字列連結演算子と継続指定「 & _ 」することにより複数行で記述する。 2.入力された水道管の呼び径を番号をもちいてSelectCase構文で基本料金を決定する。 3.従量料金のけいさんでは、まずどの呼び径の料金区分で計算するかをSelectCase構文またはIf文で決定して、各区分の料金表の単価を使用量の各増分に適用して、増分毎の料金を求めて積算する。例にも示した(2)の呼び径の場合は、使用量を複数の増分に分けて、1~5;、6~10、11~20、21~30、・・・、1001以上の各増分に異なる単価を適用する。 4.基本料金と従量料金の合計金額に消費税を加えたものが水道料金となる。この計算を行うと小数点以下の金額を切り捨てるため、Int関数の引数に計算式を書き入れ、その関数値を整数型変数に代入すればよい。 数字に単位が付いてませんがm^3です Sub ex51() '問題5 Dim x As Integer, y As Integer, z As Integer x = InputBox("呼び径を丸番号の数字で選択してください。 " & _ "(1) 13mm (2) 20mm (3) 25mm " & _ "(4) 30mm (5) 40mm (6) 50mm " & _ "(7) 75mm (8) 100mm (9) 150mm " & _ "(10) 200mm (11) 250mm (12) 300mm以上 ") y = InputBox("今月の水道使用量を立法メートル単位で入力してください。") Select Case x Case ((1)) '13mm 基本料金 = 860 Case ((2)) '20mm 基本料金 = 1170 Case ((3)) '25mm 基本料金 = 1460 Case ((4)) '30mm 基本料金 = 3435 Case ((5)) '40mm 基本料金 = 6865 Case ((6)) '50mm 基本料金 = 20720 Case ((7)) '75mm 基本料金 = 45623 Case ((8)) '100mm 基本料金 = 94568 Case ((9)) '150mm 基本料金 = 159094 Case ((10)) '200mm 基本料金 = 349434 Case ((11)) '250mm 基本料金 = 480135 Case ((12)) '300mm以上 基本料金 = 816145 End Select Select Case ((1)、(2)、(3)) If y = 1 < 5 Then z = 0 * y If y = 6 < 10 Then z = 22 * y If y = 11 < 20 Then z = 128 * y If y = 21 < 30 Then z = 163 * y If y = 31 < 50 Then z = 202 * y If y = 51 < 100 Then z = 213 * y If y = 101 < 200 Then z = 298 * y If y = 201 < 1000 Then z = 372 * y Else z = 404 * 1000 End If Select Case ((4)、(5)) If y = 1 < 100 Then z = 213 * y If y = 101 < 200 Then z = 298 * y If y = 201 < 1000 Then z = 372 * y Else z = 404 * y Select Case ((6)、(7)) If y = 1 < 1000 Then z = 372 * y Else z = 404 * y Select Case ((8)、(9)、(10)、(11)、(12)) z = 404 * y MsgBox ”水道料金=”int((x+z)*1.05) End Sub
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
前回の質問のurlも書いた方が良かったのでは? http://oshiete1.goo.ne.jp/qa3538377.html inputbox で「呼び径を丸番号の数字で選択してください。」と書いてありながら、case 文では "((1))" なんて無意味な構文になってます。 文字なら、case "(1)" とすべきで、数値なら case 1 です。 >Select Case ((1)、(2)、(3)) の部分は、使い方が間違っているのでVBEで構文チェックしていれば赤色でエラー表示になっているかと思います。 If x=1 or x=2 or x=3 then ・・・で判断する方が良いでしょう。 料金計算もHPとは計算方法が全く違っていますね。 使用量が25立方なら、 基本料金(5立方まで) + 5立方*(6~10立方の料金) +10立方*(10~20立方の料金) + 5立方*(21~30立方の料金) という計算式になりますが、IF文を組み合わせて使えば計算が出来ます。 If y > 5 Then If y < 11 Then z = (y - 5) * 22 Else z = 5 * 22 If y < 21 Then z = z + ((y - 10) * 128) Else z = z + (10 * 128) If y < 31 Then ': End If End If End If End If
その他の回答 (6)
- hana-hana3
- ベストアンサー率31% (4940/15541)
>変えてみたのですがinputboxまでしか実行できません。 プログラミングの基本で何を学んだのでしょうか? 自己解決できないレベルの問題でも無いと思いますが? プログラムからすると、変数 x は文字型(String)にするのが適切かと思いますけど・・・。
お礼
しっかりと学べていないです。 違うところをstring型で宣言していました。 実行はすべてできるようになりましたが 計算がうまくできていないので修正します。 最初から最後まで回答してくださり感謝しています。
- nnnnnon
- ベストアンサー率0% (0/1)
> やってみたらできたのですが型が合わないとしてエラーとなりました。 オーバーフローじゃないですか?
補足
どうなんでしょうか。 よくわかんないです
- hana-hana3
- ベストアンサー率31% (4940/15541)
>基本料金の宣言が間違っているのでしょうか? 宣言が Integer ですから、扱える値の範囲に制限があります。 32,767を超える可能性がある場合は、別な型にしておく方が良いでしょう。 ヘルプより~ 整数型 (Integer) の変数は、16 ビット (2 バイト) の変数で、-32,768 ~ 32,767 の範囲の値をとります。 長整数型 (Long) の変数は、32 ビット (4 バイト) の変数です。-2,147,483,648 ~ 2,147,483,647 の範囲
補足
変えてみたのですがinputboxまでしか実行できません。 デバックしてみたら Case "(1)" '13mm の部分が黄色くなりました。 どこかちがうんですかね?
- hana-hana3
- ベストアンサー率31% (4940/15541)
>でも最後がどう直せばいいのかヘルプを参照してもできないんです。 MsgBox "文字の連結" & "が必用です。" で、解りますか?
補足
回答ありがとうございます。 わかります。やってみたらできたのですが型が合わないとしてエラーとなりました。 基本料金の宣言が間違っているのでしょうか? Sub ex51() '問題5 Dim x As Integer, y As Integer, z As Integer, 基本料金 As Integer x = InputBox("呼び径を丸番号の数字で選択してください。 " & _ "(1) 13mm (2) 20mm (3) 25mm " & _ "(4) 30mm (5) 40mm (6) 50mm " & _ "(7) 75mm (8) 100mm (9) 150mm " & _ "(10) 200mm (11) 250mm (12) 300mm以上 ") y = InputBox("今月の水道使用量を立法メートル単位で入力してください。") Select Case x Case "(1)" '13mm 基本料金 = 860 Case "(2)" '20mm 基本料金 = 1170 Case "(3)" '25mm 基本料金 = 1460 Case "(4)" '30mm 基本料金 = 3435 Case "(5)" '40mm 基本料金 = 6865 Case "(6)" '50mm 基本料金 = 20720 Case "(7)" '75mm 基本料金 = 45623 Case "(8)" '100mm 基本料金 = 94568 Case "(9)" '150mm 基本料金 = 159094 Case "(10)" '200mm 基本料金 = 349434 Case "(11)" '250mm 基本料金 = 480135 Case "(12)" '300mm以上 基本料金 = 816145 End Select If x = "(1)" Or x = "(2)" Or x = "(3)" Then If y > 5 Then If y < 11 Then z = (y - 5) * 22 Else z = 5 * 22 If y < 21 Then z = z + ((y - 10) * 128) Else z = z + (10 * 128) If y < 31 Then z = z + ((y - 20) * 163) Else z = z + (10 * 163) If y < 51 Then z = z + ((y - 30) * 202) Else z = z + (20 * 202) If y < 101 Then z = z + ((y - 50) * 213) Else z = z + (50 * 213) If y < 201 Then z = z + ((y - 100) * 298) Else z = z + (100 * 298) If y < 1001 Then z = z + ((y - 200) * 372) Else z = z + (800 * 372) If y > 1001 Then z = z + ((y - 1000) * 404) Else z = z + (y * 404) End If End If End If End If End If End If End If End If End If End If If x = "(4)" Or x = "(5)" Then If y > 1 Then If y < 101 Then z = (y - 5) * 213 Else z = 100 * 213 If y < 201 Then z = z + ((y - 100) * 298) Else z = z + (100 * 298) If y < 1001 Then z = z + ((y - 200) * 372) Else z = z + (800 * 372) If y > 1001 Then z = z + ((y - 1000) * 404) Else z = z + (y * 404) End If End If End If End If End If End If If x = "(6)" Or x = "(7)" Then If y > 1 Then If y < 1001 Then z = (y - 5) * 372 Else z = 1000 * 372 If y < 1001 Then z = z + (y - 1000) * 404 Else z = z + (y * 404) End If End If End If End If If x = "(8)" Or x = "(9)" Or x = "(10)" Or x = "(11)" Or x = "(12)" Then z = y * 404 End If MsgBox "水道料金=" & Int((基本料金 + z) * 1.05) End Sub
- hana-hana3
- ベストアンサー率31% (4940/15541)
>ちなみに最初の"(1)"のカッコは丸1がうまく表示できなくてこうなりました。 単純な入力の場合には、わざわざ全角入力を強要しない方が良いでしょう。 使う立場からすると任意の数値を入れるだけの方が操作も早いですからね。 >どんな感じで間違ってますかね? 誤りの一例です。 「z = z + (20 * 163)」 となっていますが、20 * 163 の部分で何の計算をしているのか理解できれば、正しく修正できます。 ・・・単価が163円で計算できるのは何立方でしょうか? >msgbox "水道料金=" int((基本料金+z)*1.05) もVBEではエラー表示になっていますね。 この程度なら簡単に直せるでしょう。 あと、 If x = "(1)" Or ・・・ Then EndIf If x = "(4)" Or ・・・ Then EndIf : : と複数のIF文に分けていますが、 If x = "(1)" Or ・・・ Then '処理 ElseIf x = "(4)" Or ・・・ Then '処理 ElseIf x = ・・・ Then '処理 : Else '処理 EndIf のようにした方が良いと思います。
補足
回答ありがとうございます。 従量料金の方は理解できたとおもいます。 でも最後がどう直せばいいのかヘルプを参照しても できないんです。 全文が間違っているのですかね? msgbox"水道料金=" Int((基本料金+z)*1.05)
- redfox63
- ベストアンサー率71% (1325/1856)
このコードで実行してみましたか? ほとんどエラーで実行できないと思いますよ if文は if 条件 then 実行文 end if が基本です 相反する条件なら if 条件 then 実行文1 else 実行文2 end if といった構文です 単一文のみに関わるIf文なら if 条件 then 実行文 となります 『if y=1 < 100 then』 がどのような評価を期待したものでしょう yが1以上100未満の場合に真になることを期待したのであればこの書き方では期待通りの実行は望めません y>=1 and y < 100 といった条件になります また選択の select caseには 必ず何処までが選択処理なのかを示す end selectが必要です select caseや caseの引数に ()は今回のケースでは必要ありません select caseの引数には一般的に変数を割り当てます caseの引数には定数を設定するのが一般的です 問題文全てを載せるより もっと的を絞った質問をしましょう VB6付属のヘルプ MSDNなどを活用してエラーになる原因を特定しデバッグしましょうね
お礼
回答ありがとうございます。 少しずつ理解できてきています。 完成までよろしくおねがいします。
補足
Sub ex51() '問題5 Dim x As Integer, y As Integer, z As Integer, 基本料金 As String x = InputBox("呼び径を丸番号の数字で選択してください。 " & _ "(1) 13mm (2) 20mm (3) 25mm " & _ "(4) 30mm (5) 40mm (6) 50mm " & _ "(7) 75mm (8) 100mm (9) 150mm " & _ "(10) 200mm (11) 250mm (12) 300mm以上 ") y = InputBox("今月の水道使用量を立法メートル単位で入力してください。") Select Case x Case "(1)" '13mm 基本料金 = 860 Case "(2)" '20mm 基本料金 = 1170 Case "(3)" '25mm 基本料金 = 1460 Case "(4)" '30mm 基本料金 = 3435 Case "(5)" '40mm 基本料金 = 6865 Case "(6)" '50mm 基本料金 = 20720 Case "(7)" '75mm 基本料金 = 45623 Case "(8)" '100mm 基本料金 = 94568 Case "(9)" '150mm 基本料金 = 159094 Case "(10)" '200mm 基本料金 = 349434 Case "(11)" '250mm 基本料金 = 480135 Case "(12)" '300mm以上 基本料金 = 816145 End Select If x = "(1)" Or x = "(2)" Or x = "(3)" Then If y > 5 Then If y < 11 Then z = (y - 5) * 22 Else z = 5 * 22 If y < 21 Then z = z + ((y - 10) * 128) Else z = z + (10 * 128) If y < 31 Then z = z + ((y - 20) * 163) Else z = z + (20 * 163) If y < 51 Then z = z + ((y - 30) * 202) Else z = z + (30 * 202) If y < 101 Then z = z + ((y - 50) * 213) Else z = z + (50 * 213) If y < 201 Then z = z + ((y - 100) * 298) Else z = z + (100 * 298) If y < 1001 Then z = z + ((y - 200) * 372) Else z = z + (200 * 372) If y > 1001 Then z = z + ((y - 1000) * 404) Else z = z + (1000 * 404) End If End If End If End If End If End If End If End If End If End If If x = "(4)" Or x = "(5)" Then If y > 1 Then If y < 101 Then z = (y - 5) * 213 Else z = 5 * 213 If y < 201 Then z = z + ((y - 100) * 298) Else z = z + (100 * 298) If y < 1001 Then z = z + ((y - 200) * 372) Else z = z + (200 * 372) If y > 1001 Then z = z + ((y - 1000) * 404) Else z = z + (1000 * 404) End If End If End If End If End If End If If x = "(6)" Or x = "(7)" Then If y > 1 Then If y < 1001 Then z = (y - 5) * 372 Else z = 5 * 372 If y < 1001 Then z = z + (y - 1000) * 404 Else z = z + (1000 * 404) End If End If End If End If If x = "(8)" Or x = "(9)" Or x = "(10)" Or x = "(11)" Or x = "(12)" Then If y < 1 Then z = 5 * 404 Else z = 5 * 404 End If End If msgbox "水道料金=" int((基本料金+z)*1.05) End Sub こんな風にしたんですが最後のほうの計算があやしいんですが どんな感じで間違ってますかね? あと最初のXのINPUTBOXと最後の計算式がうまくできないんですが うまくできる方法ありますか? 回答よろしくおねがいします。 ちなみに最初の"(1)"のカッコは丸1がうまく表示できなくてこうなりました。