EMZETT.
Login

Kurz: Sub Main() Console.WriteLine(String.Join(” ”, Sieb(50))) Console.WriteLine(Sieb(10000).Count) End Sub End Module `output 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 1229

Teil des Kurses Visual Basic .NET

Kapitel 7 von 8 im Kurs Visual Basic .NET. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Primzahlsieb

Module Program
    Function Sieb(n As Integer) As List(Of Integer)
        Dim prim(n) As Boolean
        For i As Integer = 2 To n
            prim(i) = True
        Next
        For i As Integer = 2 To CInt(Math.Sqrt(n))
            If prim(i) Then
                For j As Integer = i * i To n Step i
                    prim(j) = False
                Next
            End If
        Next
        Dim erg As New List(Of Integer)
        For i As Integer = 2 To n
            If prim(i) Then erg.Add(i)
        Next
        Return erg
    End Function
 
    Sub Main()
        Console.WriteLine(String.Join(" ", Sieb(50)))
        Console.WriteLine(Sieb(10000).Count)
    End Sub
End Module

Ausgabe:

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
1229

Caesar-Chiffre

Module Program
    Function Verschiebe(text As String, schluessel As Integer) As String
        Dim erg As New System.Text.StringBuilder()
        For Each c In text
            If Char.IsLower(c) Then
                erg.Append(ChrW((AscW(c) - AscW("a"c) + schluessel + 26) Mod 26 + AscW("a"c)))
            ElseIf Char.IsUpper(c) Then
                erg.Append(ChrW((AscW(c) - AscW("A"c) + schluessel + 26) Mod 26 + AscW("A"c)))
            Else
                erg.Append(c)
            End If
        Next
        Return erg.ToString()
    End Function
 
    Function IstPalindrom(s As String) As Boolean
        Dim t = New String(s.ToLower().Where(Function(c) Char.IsLetter(c)).ToArray())
        Return t = StrReverse(t)
    End Function
 
    Sub Main()
        Dim geheim = Verschiebe("Hallo VB!", 3)
        Console.WriteLine(geheim)
        Console.WriteLine(Verschiebe(geheim, -3))
        Console.WriteLine(IstPalindrom("Anna") & " " & IstPalindrom("Basic") & " " & IstPalindrom("Ein Esel lese nie"))
    End Sub
End Module

Ausgabe:

Kdoor YE!
Hallo VB!
True False True

Auswertung mit LINQ

Module Program
    Class Verkauf
        Public Property Region As String
        Public Property Produkt As String
        Public Property Menge As Integer
        Public Property Preis As Decimal
        Public ReadOnly Property Umsatz As Decimal
            Get
                Return Menge * Preis
            End Get
        End Property
    End Class
 
    Sub Main()
        Dim daten As New List(Of Verkauf) From {
            New Verkauf With {.Region = "Nord", .Produkt = "Apfel", .Menge = 10, .Preis = 1.2D},
            New Verkauf With {.Region = "Sued", .Produkt = "Birne", .Menge = 5, .Preis = 0.8D},
            New Verkauf With {.Region = "Nord", .Produkt = "Birne", .Menge = 8, .Preis = 0.8D},
            New Verkauf With {.Region = "West", .Produkt = "Apfel", .Menge = 20, .Preis = 1.1D},
            New Verkauf With {.Region = "Sued", .Produkt = "Apfel", .Menge = 7, .Preis = 1.2D}
        }
        For Each g In daten.GroupBy(Function(v) v.Region).OrderBy(Function(x) x.Key)
            Console.WriteLine($"{g.Key,-5} {g.Sum(Function(v) v.Umsatz),7:F2}")
        Next
        Console.WriteLine($"Gesamt: {daten.Sum(Function(v) v.Umsatz):F2}")
        Dim bester = daten.OrderByDescending(Function(v) v.Umsatz).First()
        Console.WriteLine($"Bester Posten: {bester.Produkt} in {bester.Region}")
        Console.WriteLine($"Äpfel: {daten.Where(Function(v) v.Produkt = "Apfel").Sum(Function(v) v.Menge)}")
    End Sub
End Module

Ausgabe:

Nord    18.40
Sued    12.40
West    22.00
Gesamt: 52.80
Bester Posten: Apfel in West
Äpfel: 37

Mini-Testframework

Module Program
    Private bestanden As Integer = 0
    Private fehler As Integer = 0
 
    Sub Pruefe(name As String, bedingung As Boolean)
        If bedingung Then
            bestanden += 1
            Console.WriteLine("ok     " & name)
        Else
            fehler += 1
            Console.WriteLine("FEHLER " & name)
        End If
    End Sub
 
    Function Fak(n As Integer) As Integer
        If n <= 1 Then Return 1
        Return n * Fak(n - 1)
    End Function
 
    Sub Main()
        Pruefe("Fak(5)", Fak(5) = 120)
        Pruefe("Fak(0)", Fak(0) = 1)
        Pruefe("Reverse", StrReverse("abc") = "cba")
        Pruefe("absichtlich falsch", 1 + 1 = 3)
        Console.WriteLine($"{bestanden} bestanden, {fehler} fehlgeschlagen")
    End Sub
End Module

Ausgabe:

ok     Fak(5)
ok     Fak(0)
ok     Reverse
FEHLER absichtlich falsch
3 bestanden, 1 fehlgeschlagen

Merke

  • VB.NET eignet sich für übersichtliche Geschäftslogik und Auswertungen
  • LINQ mit GroupBy, Sum, OrderBy ersetzt Schleifen
  • With-Initialisierer (New T With {...}) erzeugen Objekte kompakt
  • Für Tests nutzt man MSTest, NUnit oder xUnit

Übungsaufgabe

Erweitere die Auswertung um den Durchschnittspreis je Produkt.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Generics, Async und Nebenläufigkeit

Weiter: Referenz und Spickzettel

Alle Kapitel: Visual Basic .NET im Überblick