VB.Net Tutorial/Operator/Operator
Содержание
Calculate PI
<source lang="vbnet">" Quote from "Visual Basic 2005 Cookbook Solutions for VB 2005 Programmers "by Tim Patrick (Author), John Craig (Author) "# Publisher: O"Reilly Media, Inc. (September 21, 2006) "# Language: English "# ISBN-10: 0596101775 "# ISBN-13: 978-0596101770
Public Class Tester
Public Shared Sub Main Console.WriteLine(FindPi(500)) End Sub Private Shared NumberDigits As Integer Public Shared Function FindPi(ByVal digits As Integer) As String " ----- Calculate Pi to the specified number of digits, " based on the formula: " Pi/4 = arctan(1/2) + arctan(1/3) Dim result As New System.Text.StringBuilder("PI=3.") Dim digitIndex As Integer Dim divFactor As Integer " ----- Build an array that will hold manual calculations. NumberDigits = digits + 2 Dim targetValue(NumberDigits) As Integer Dim sourceValue(NumberDigits) As Integer " ---- Perform the calculation. divFactor = 2 ArcTangent(targetValue, sourceValue, divFactor) divFactor = 3 ArcTangent(targetValue, sourceValue, divFactor) ArrayMult(targetValue, 4) " ----- Return a string version of the calculation. For digitIndex = 1 To NumberDigits - 3 result.Append(Chr(targetValue(digitIndex) + Asc("0"c))) Next digitIndex Return result.ToString End Function Private Shared Sub ArrayMult(ByRef baseNumber() As Integer, _ ByRef multiplier As Integer) " ----- Multiply an array number by another number by hand. " The product remains in the array number. Dim carry As Integer Dim position As Integer Dim holdDigit As Integer " ----- Multiple each base digit, from right to left. For position = NumberDigits To 0 Step -1 " ----- If the multiplication went past 9, carry the " tens value to the next column. holdDigit = (baseNumber(position) * multiplier) + carry carry = holdDigit \ 10 baseNumber(position) = holdDigit Mod 10 Next position End Sub Private Shared Sub ArrayDivide(ByRef dividend() As Integer, ByRef divisor As Integer) " ----- Divide an array number by another number by hand. " The quotient remains in the array number. Dim borrow As Integer Dim position As Integer Dim holdDigit As Integer " ----- Process division for each digit. For position = 0 To NumberDigits " ----- If the division can"t happen directly, borrow from " the previous position. holdDigit = dividend(position) + borrow * 10 dividend(position) = holdDigit \ divisor borrow = holdDigit Mod divisor Next position End Sub Private Shared Sub ArrayAdd(ByRef baseNumber() As Integer, ByRef addend() As Integer) " ----- Add two array numbers together. " The sum remains in the first array number. Dim carry As Integer Dim position As Integer Dim holdDigit As Integer " ----- Add each digit from right to left. For position = NumberDigits To 0 Step -1 " ----- If the sum goes beyond 9, carry the tens " value to the next column. holdDigit = baseNumber(position) + addend(position) + carry carry = holdDigit \ 10 baseNumber(position) = holdDigit Mod 10 Next position End Sub Private Shared Sub ArraySub(ByRef minuend() As Integer, ByRef subtrahend() As Integer) " ----- Subtract one array number from another. " The difference remains in the first array number. Dim borrow As Integer Dim position As Integer Dim holdDigit As Integer " ---- Subtract the digits from right to left. For position = NumberDigits To 0 Step -1 " ----- If the subtraction would give a negative value " for a column, we will have to borrow. holdDigit = minuend(position) - subtrahend(position) + 10 borrow = holdDigit \ 10 minuend(position) = holdDigit Mod 10 If (borrow = 0) Then minuend(position - 1) -= 1 Next position End Sub Private Shared Function ArrayZero(ByRef baseNumber() As Integer) As Boolean " ----- Report whether an array number is all zero. Dim position As Integer " ----- Examine each digit. For position = 0 To NumberDigits If (baseNumber(position) <> 0) Then " ----- The number is nonzero. Return False End If Next position " ----- The number is zero. Return True End Function Private Shared Sub ArcTangent(ByRef targetValue() As Integer, _ ByRef sourceValue() As Integer, _ ByVal divFactor As Integer) " ----- Calculate an arctangent of a fraction, 1/divFactor. " This routine performs a modified Maclaurin series to " calculate the arctangent. The base formula is: " arctan(x) = x - x^3/3 + x^5/5 - x^7/7 + x^9/9 - ... " where -1 < x < 1 (it"s 1/divFactor in this case). Dim workingFactor As Integer Dim incremental As Integer " ----- Figure out the "x" part, 1/divFactor. sourceValue(0) = 1 incremental = 1 workingFactor = divFactor ArrayDivide(sourceValue, workingFactor) " ----- Add "x" to the total. ArrayAdd(targetValue, sourceValue) Do " ----- Perform the "- (xy)/y" part. ArrayMult(sourceValue, incremental) workingFactor = divFactor * divFactor ArrayDivide(sourceValue, workingFactor) incremental += 2 workingFactor = incremental ArrayDivide(sourceValue, workingFactor) ArraySub(targetValue, sourceValue) " ----- Perform the "+ (xy)/y" part. ArrayMult(sourceValue, incremental) workingFactor = divFactor * divFactor ArrayDivide(sourceValue, workingFactor) incremental += 2 workingFactor = incremental ArrayDivide(sourceValue, workingFactor) ArrayAdd(targetValue, sourceValue) Loop Until ArrayZero(sourceValue) End Sub
End Class</source>
PI=3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211 7067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930 3819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491 4127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151 1609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011 9491
Compact operators
<source lang="vbnet">Public Class Tester
Public Shared Sub Main Dim result As New System.Text.StringBuilder Dim testDouble As Double = Math.PI result.Append("Double ").AppendLine(testDouble) testDouble += Math.PI result.Append("+= ").AppendLine(testDouble) testDouble *= Math.PI result.Append("*= ").AppendLine(testDouble) testDouble -= Math.PI result.Append("-= ").AppendLine(testDouble) testDouble /= Math.PI result.Append("/= ").AppendLine(testDouble) testDouble ^= Math.PI result.Append("^= ").AppendLine(testDouble) result.AppendLine() Dim testInteger As Integer = 17 result.Append("Integer ").AppendLine(testInteger) testInteger \= 2 result.Append("\= 2 ... ").AppendLine(testInteger) testInteger += 1 result.Append("+= 1 ... ").AppendLine(testInteger) testInteger <<= 1 result.Append("<<= 1 ... ").AppendLine(testInteger) testInteger >>= 3 result.Append(">>= 3 ... ").AppendLine(testInteger) result.AppendLine() Dim testString As String = "Abcdef" result.Append("String ").AppendLine(testString) testString &= "ghi" result.Append("&= ghi ... ").AppendLine(testString) testString += "jkl" result.Append("+= jkl ... ").AppendLine(testString) Console.WriteLine(result.ToString()) End Sub
End Class</source>
Double 3.14159265358979 += 6.28318530717959 *= 19.7392088021787 -= 16.5976161485889 /= 5.28318530717959 ^= 186.656996003562 Integer 17 \= 2 ... 8 += 1 ... 9 <<= 1 ... 18 >>= 3 ... 2 String Abcdef &= ghi ... Abcdefghi += jkl ... Abcdefghijkl
Prime numbers using the Sieve of Eratosthenes
<source lang="vbnet">Imports System.Drawing Imports System.Drawing.Drawing2D Imports System.Collections Public Class Tester
Public Shared Sub Main Dim needBreak As Boolean = True Console.WriteLine("Prime numbers using the ""Sieve of Eratosthenes""") Dim index As Integer = 1 Dim counter As Integer Do While (index < (MaxNumber - 1)) index += 1 If (PrimeStorage(index) = True) Then For counter = index * 2 To MaxNumber - 1 Step index PrimeStorage(counter) = False Next counter End If Loop For counter = 2 To 7999999 If (GetBit(counter) = 1) Then If (counter < 50) Or (counter > 7999800) Then Console.WriteLine(counter) ElseIf (needBreak = True) Then Console.WriteLine("...") needBreak = False End If End If Next counter End Sub Private Const MaxNumber As Integer = 8000000 Private Shared PrimeStorage As New BitArray(MaxNumber, True) Public Shared Function GetBit(ByVal index As Integer) As Integer If (PrimeStorage(index) = True) Then Return 1 Else Return 0 End Function
End Class</source>
Prime numbers using the "Sieve of Eratosthenes 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 ... 7999811 7999813 7999847 7999909 7999913 7999919 7999921 7999963 7999993
Using an assignment operator to calculate a power of 2
<source lang="vbnet">Module Tester
Sub Main() Dim exponent As Integer " power input by user Dim result As Integer = 2 " number to raise to a power exponent = 12 result ^= exponent " same as result = result ^ exponent Console.WriteLine("result = exponent: {0}", result) result = 2 " reset result to 2 result = result ^ exponent Console.WriteLine("result = result exponent: {0}", result) End Sub
End Module</source>
result ^= exponent: 4096 result = result ^ exponent: 4096