2017-05-18 10 views
1

VB.NETでの私の仕事の1つは、ユーザーから入力された15のテストスコアを取り込み、平均を計算して対応する文字グレードを返すvb.netのプログラムを作成することでした。コードは以下の通りです。パラメータとして使用される変数はその値を変更できません。 vb.net

Module Module1 
    Public Test1 As Decimal = 0 
    Public Test2 As Decimal = 0 
    Public Test3 As Decimal = 0 
    Public Test4 As Decimal = 0 
    Public Test5 As Decimal = 0 
    Public Test6 As Decimal = 0 
    Public Test7 As Decimal = 0 
    Public Test8 As Decimal = 0 
    Public Test9 As Decimal = 0 
    Public Test10 As Decimal = 0 
    Public Test11 As Decimal = 0 
    Public Test12 As Decimal = 0 
    Public Test13 As Decimal = 0 
    Public Test14 As Decimal = 0 
    Public Test15 As Decimal = 0 
    Public counter As Integer = 1 
    Public letterGrade As Char 
    Sub Main() 
     Console.WriteLine("This program will take 15 inputted test scores, 
     and then it will return an average and letter grade") 
     question(Test1) 
     question(Test2) 
     question(Test3) 
     question(Test4) 
     question(Test5) 
     question(Test6) 
     question(Test7) 
     question(Test8) 
     question(Test9) 
     question(Test10) 
     question(Test11) 
     question(Test12) 
     question(Test13) 
     question(Test14) 
     question(Test15) 
     Dim av As Decimal 
     av = (Test1 + Test2 + Test3 + Test4 + Test5 + Test6 + Test7 + Test8 
     + Test9 + Test10 + Test11 + Test12 + Test13 + Test14 + Test15)/15 
     If av >= 90 Then 
      letterGrade = "A" 
     ElseIf 80 <= av < 90 Then 
      letterGrade = "B" 
     ElseIf 70 <= av < 80 Then 
      letterGrade = "C" 
     ElseIf 60 <= av < 70 Then 
      letterGrade = "D" 
     Else 
      letterGrade = "F" 
     End If 
     MsgBox("You average is" + Str(av) + "%. You got a " + letterGrade + 
     "!") 
    End Sub 

    Sub question(ByVal score2 As Decimal) 
     Console.WriteLine("") 
     Console.WriteLine("Enter test score number" + Str(counter)) 
     input(score2) 
     counter += 1 
    End Sub 

    Sub input(ByVal score As Decimal) 
     Try 
      score = Console.ReadLine() 
      If score < 0 Then 
       Throw New Exception() 
      End If 
     Catch ex As Exception 
      Console.WriteLine("You entered an invalid input (number was too 
      large, was a negative, or was not a number)") 
      question(score) 
     End Try 
    End Sub 
End Module 

プログラムは、最初に15の変数を作成します。その後、メインプログラムでは、ユーザにスコアを入力するよう質問する質問機能(パラメータを含む)を実行する。最後に、入力関数(パラメータを持つ)を実行します。この関数は、ユーザー入力を記録し、パラメータに格納します。例外が捕捉された場合、入力は質問関数に戻り、同じ質問を再度求めます。これは、ユーザーが有効な入力を入力して次のテストスコアに移動するまで実行されます。 15の入力を得た後、それはそれらすべてを平均し、文字の等級を見つける。私は最初に作成した変数をパラメータとして渡しますので、ユーザーが入力した値にその値を変更するはずです。ホバー、私はプログラムを実行すると、私は何の数字を入力しても0の平均とBの文字グレードを返します。変数を変更した後に変数を出力するようにプログラムに指示し、すべての変数を0として出力しました。これは設定した初期値でした。なぜこれが起こるのですか?変数をパラメータとして使用し、その値を関数のユーザ入力に変更できますか?

答えて

2

関数で使用される変数を使用してその値を保持することはできますが、そのためには参照を渡す必要があります。

「Byval」を使用しているコードでは、ByRefに変更してください。

Sub question(ByRef score2 As Decimal) 

Sub input(ByRef score As Decimal) 

「ByVal」で使用されるパラメータは、基本的に、別の変数にコピーされ、その中で実行する必要のある機能doに与えられます。

Ref(ByRef)として渡すように設定すると、実際には変数自体にポインタが渡され、アクセス権はコピーではなく直接渡されます。

this link

+1

を見てみましょうありがとうございました!プログラムが動作し、あなたが私に言っていることを理解しました!ありがとうございました! –

関連する問題