1

私は、水の使用量に基づいて請求書を決定するビジュアルベーシック用にこのプログラムを書いています。私の問題は、入力したすべての値がコマンド プロンプトでゼロとして返されることです。このコードの何が問題なのか誰か説明できますか?


Option Explicit On
Option Strict On

Imports System

module eurekawatercompany

  Sub Main ()
    ' Declare variables of problem
    Dim waterusage as double 
    Dim totalcharge as double

    ' Prompts for user to enter their water usage.
    Console.write ("Please enter your current water usage (cubic feet): ")
    waterusage = convert.toint32(console.readline())
      If (waterusage < 1000) then
      totalcharge = 15

      End If

      If (1000 > waterusage) and (waterusage < 2000) then
      totalcharge = 0.0175 * waterusage + 15

      End If

      else if (2000 < waterusage) and (waterusage > 3000) then
      totalcharge = 0.02 * waterusage + 32.5

      End If
      ' 32.5 is the price of exactly 2000cm^(3) of water

      else if (waterusage > 3000) then
      totalcharge = 70

      End If

    Console.out.writeline ("Total charge is: ")
      Console.out.writeline (totalcharge)


  End sub

End Module
4

1 に答える 1

3

まず、あなたの声明:

If (1000 > waterusage) and (waterusage < 2000) then

と同等です:

If (waterusage < 1000) and (waterusage < 2000) then

これは、1000未満と2000未満の両方のテストであることを意味しますwaterusage(つまり、1000未満であるということです)。私はあなたが次の線に沿って何かを意味したかもしれないと思います:

If (waterusage > 1000) and (waterusage <= 2000) then

あなたのステートメントはエッジケースをまったく処理しない<=ので、私も使用したことに気付くでしょう(2000は2000より小さくも大きくもないので、2000を入力しても元のステートメントは起動しません)。ifif

0 to 1000とケースにも同様の変更を加える必要があります2000 to 3000


また、次のことも完全にはわかりません。

:
End If
else if ...

構成は正しいです(VB.NETがVB6の日以降、低レベルで大幅に変更されていない限り(多くの変更があったことは知っていますが、動作などの低レベルのものを変更する可能性は低いifです)。私の知る限り、ステートメント全体なので、との間にある必要があります。end if ifelseifend if

だから私は次のようなものを見ているでしょう:

Option Explicit On
Option Strict On
Imports System
Module EurekaWaterCompany

Sub Main ()
    Dim WaterUsage as double
    Dim TotalCharge as double

    Console.Out.Write ("Please enter your current water usage (cubic feet): ")
    WaterUsage = Convert.ToInt32 (Console.In.ReadLine())

    If (WaterUsage <= 1000) then
        TotalCharge = 15
    ElseIf (WaterUsage > 1000) and (WaterUsage <= 2000) then
        TotalCharge = 0.0175 * WaterUsage + 15
    ElseIf (Waterusage > 2000) and (WaterUsage <= 3000) then
        TotalCharge = 0.02 * WaterUsage + 32.5
    Else
        TotalCharge = 70
    End If

    Console.Out.WriteLine ("Total charge is: ")
    Console.Out.WriteLine (TotalCharge)
End sub

End Module

このコードには、I / Oの適切な指定OutIn使用、「適切な」キャピタライゼーションの使用など、いくつかのマイナーな修正も含まれていますが、完全にはテストされておらず、構文エラーが発生する可能性があります。コードの背後にある考え方(基本的にはifステートメント)はまだ健全です。


ただし、仕様を確認することをお勧めします。

公益事業者がリソースに対して課金する場合、全額ではなく、特定のレベルを超えた超過分に対してより高い税率を課す傾向があります。言い換えると、最初の1000立方フィートで15ドル、それ以降は各立方フィートで1.75セントの料金が発生すると予想されます。これにより、ステートメントは次のようになります。

ElseIf (WaterUsage > 1000) and (WaterUsage <= 2000) then
    TotalCharge = 0.0175 * (WaterUsage - 1000) + 15

この状況では、最初の1000は1.5c / ft 3、2番目の1000は1.75c / ft 3、3番目の1000は2c / ft 3が請求され、下限は$ 15(実際にいくら使用しても最初の1,000ドルが請求され、3000立方フィートを超える使用者には70ドルの固定料金が請求されます(一種のペナルティ率)。

しかし、それは私の経験からの推測です。あなたの仕様がそうではないと言っているかもしれません、その場合、このセクションを無視してください。

于 2012-09-17T23:26:53.303 に答える