VB.Net Tutorial/Operator/Operator

Материал из VB Эксперт
Версия от 15:54, 26 мая 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

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