Buchempfehlung
MySQL kurz & gut
MySQL kurz & gut
Das preiswerte Taschen- buch stellt MySQL-rele- vante Inhalte systematisch und knapp dar, sodass es sich optimal zum Nach- schlagen beim Pro- grammieren eignet. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

Telefonbuchsortierung für String-Arrays

Uploader:AdministratorSebastian
Datum/Zeit:09.01.2010 20:02:23

' Telefonbuch-Vergleich/-Sortierung von Strings bzw. Stringfeldern
' Nicht optimiert (langsam!), aber einfach
' Getestet mit FreeBASIC 0.20.0

' Permission is hereby granted, free of charge, to any person obtaining a
' copy of this software and associated documentation files (the "Software"),
' to deal in the Software without restriction, including without limitation
' the rights to use, copy, modify, merge, publish, distribute, sublicense,
' and/or sell copies of the Software, and to permit persons to whom the
' Software is furnished to do so, subject to the following conditions:
' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
' OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
' FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
' THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
' LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
' FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
' DEALINGS IN THE SOFTWARE.


' ******** Funktionen fuer den Telefonbuch-Stringvergleich/sortierung ********

Function TBMin (ByVal ZahlA As Integer, ByVal ZahlB As Integer) As Integer
    If (ZahlA < ZahlB) Then
        Return ZahlA
    Else
        Return ZahlB
    End If
End Function

Function TBUmlauteErsetzen(ByVal TextEing As String) As String
    Dim UmlCodes(1 to 7) As UByte   = {142, 132, 153, 148, 154, 129, 225 }
    Dim UmlErsetz(1 to 7) As String = {"AE","ae","OE","oe","UE","ue","ss"}
    Dim As String Text = TextEing, Neu
    Dim As UByte z
    For i As Integer = 0 To Len(Text)-1
        z = Text[i]
        For j As Integer = 1 To 7
            If (z = UmlCodes(j)) Then
                Neu += UmlErsetz(j)
                Continue For
            End If
        Next j
        If ((z >= 65) and (z <= 90)) or ((z >= 97) and (z <= 122)) Then
            Neu += CHR(z)
        End If
    Next i
    Return Neu
End Function

Function TBGewichtung (ByVal z As Integer) As Integer
    If ((z >= 65) and (z <= 90)) Then
        Return ((z-64)*2-1) 'A=1, B=3, C=5, ...
    Else
        Return ((z-96)*2) 'a=2, b=4, c=6, ...
    End If
End Function

Function TBVergleich_AKleinerB (ByVal Ax As String, ByVal Bx As String) As Integer
    'Wenn A < B, liefert die Function 1, ansonsten 0 zurueck. Durch Auswertung
    'der Rueckgabe koennen die beiden Zeichenketten dann bzgl. ihrer Ordnung
    'bei Telefonbuchsortierung verglichen werden.
    'Beispiele:
    '  TBVergleich_AKleinerB ("Aaron","Albert") == 1
    '  TBVergleich_AKleinerB ("Müller","Meier") == 0
    Dim As String A, B
    'Im Folgenden werden die Umlaute ersetzt und Sonderzeichen entfernt.
    A = TBUmlauteErsetzen(Ax)
    B = TBUmlauteErsetzen(Bx)
    For i As Integer = 0 To TBMin(Len(A), Len(B))-1
        If (TBGewichtung(A[i]) < TBGewichtung(B[i])) Then
            Return 1
        ElseIf (TBGewichtung(A[i]) > TBGewichtung(B[i])) Then
            Return 0
        End If
    Next i
    'Die Function wurde in der For-Schleife nicht mit Return verlassen, d.h.
    'beide Strings sind beim verglichenen Teil gleich.
    '
    ' Beispiel: MUELL
    '           MUELLER
    '           \___/
    '         verglichen
    '
    'Die Zeichenkette, die laenger ist als die andere, soll als "groesser"
    'gewertet werden.
    If Len(A) < Len(B) Then
        Return 1
    Else
        Return 0
    End If
End Function

'Telefonbuchsortierung fuer String-Arrays (basiert auf BubbleSort)
Sub TBSortieren (Array() As String)
    Dim As Integer i, n, vertauscht
    n = UBound(Array)
    Do
        vertauscht=0
        For i = LBound(Array) To n-1
            If (TBVergleich_AKleinerB(Array(i+1),Array(i))) Then
                SWAP Array(i), Array(i+1)
                vertauscht=1
            End If
        Next i
        n -= 1
    Loop While (vertauscht And (n >= 1))
End Sub

' ************** Funktionen fuer die Demo-Oberflaeche **************

Sub TabelleLeerzeile (ByVal Spalten As Integer)
    Print String(8,196); Chr(197);
    For i As Integer = 1 To Spalten
        Print String(9, 196);
        if i < Spalten Then Print Chr(197);
    Next i
    Print ""
End Sub



' ************** Hauptprogramm **************

' Testnamen
Dim Namen(1 To 11) As String = _
    { "Mller", "mueller", "Meier", "Mllhas", "Máig", "Mosel", _
      "Mubach", "Mykron", "Mussman", "M„kel", "Makler"            }

'Vergleichstabelle darstellen: Jeden Namen mit jedem vergleichen

Width 120,28
Cls

Print "        "; chr(179); " ";
For i As Integer = LBound(Namen) To UBound(Namen)
    Color 14
    Print Using "\     \"; Namen(i);
    Color 7
    If (i < Ubound(Namen)) Then Print " "; CHR(179); " ";
Next i
Print ""
TabelleLeerzeile (UBound(Namen)-LBound(Namen)+1)
For i As Integer = LBound(Namen) To UBound(Namen)
    Color 12
    Print Using "\     \ "; Namen(i);
    Color 7
    For j As Integer = LBound(Namen) To UBound(Namen)
        Print chr(179); " ";
        Color 14
        Print "A";
        Color 7
        Print "<";
        Color 12
        Print "B";
        Color 7
        Print "? "; Str(TBVergleich_AKleinerB(Namen(j), Namen(i))); "  ";
    Next j
    Print ""
    If (i < Ubound(Namen)) Then TabelleLeerzeile (UBound(Namen)-LBound(Namen)+1)
Next i

Print
Print "Alle Vergleiche wurden durchgefuehrt."
Print "Druecken Sie eine beliebige Taste, um die Namen jetzt gemaess ";
Print "Telefonbuchsortierung sortieren zu lassen."

Sleep

Width 80, 25
Cls

Print "Unsortiert:      Sortiert:"
Print "------------     ------------"
For i As Integer = LBound(Namen) To UBound(Namen)
    Locate 2+i, 1: PRINT Namen(i)
Next i

TBSortieren(Namen())

For i As Integer = LBound(Namen) To UBound(Namen)
    Locate 2+i, 18: PRINT Namen(i)
Next i

PRINT
PRINT "Druecken Sie eine beliebige Taste, um das Programm zu beenden."

Sleep