Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Zeichenkettenabgleich (Zeichenketten)

Sie bekommen vom Benutzer eine Hauptkette aus Zeichen und eine Nebenkette aus Zeichen angegeben. Der Benutzer will nun wissen, zu wie viel Prozent die Nebenkette mit der Hauptkette übereinstimmt. Hierbei sollen Zeichenlänge der Ketten, die Anzahl von gleichen Positionen, von gleichen Zeichen, in beiden Ketten und der Inhalt beachtet werden. Die Prozent sollen mit zwei Nachkommastellen angegeben werden. Jeder der drei Punkte erhällt einen Prozentwert. Diese werden am Ende zusammenaddiert und durch drei geteilt. So enstehen die Gesammtprozent.

Folgendes ist hierbei zu beachten:

Länge: Die Länge der Hauptkette sind 100%. Eine Länge von 0 Zeichen sind 0%. Bedeutet im Umkehrschluss, dass eine Länge von der doppelten Länge der hauptkette, oder größer, auch 0 % sind.

Bsp.: Hauptkettenlänge 10

Nebenkettenlänge 0: 0%

Nebenkettenlänge 1: 10%

.....

Nebenkettenlänge 10: 100%

Nebenkettenlänge 11: 90%

...

 

Position: Die Position bezieht sich auf die Stelle eines Zeichens in der Kette, das in beiden Zeichenketten den selben Wert und die selbe Stelle hat. Die Prozent hierfür werden mit prozent*gleichePositionen berechnet. prozent ist hier wieder abhängig von der Zeichenkettenlänge der Hauptkette.

 

Inhalt: Es wird abgezählt, wie oft die einzelnen Zeichen aus der Nebenkette in der Hauptkette vorkommen (Keine doppelten abgleiche). Dementsprechend werden die Prozent wieder mit prozent*gleicheZeichen berechnet. prozent ist hier ebenfalls abhängig von der Zeichenkettenlänge der Hauptkette.

Bsp.: Hauptkette: Flugzeug

Nebenkette: Affe

-> zwei Übereinstimmungen, da "f" und "e" jeweils ein Mal in Flugzeug

 

Extra: Lassen Sie den Benutzer zu Beginn entscheiden, ob Groß- und Kleinschreibung bei den drei Prüfungen beachtet werden soll oder nicht.

4 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

Kommentare (4)

crouser 4. Februar 2014 14:53   reply report
gressly
Bitte um einige Verifikationen, damit ich mein Programm auch testen kann, bevor ich die Lösung hochlade.

Beispiel so:
(Hauptkette, Nebenkette) -> (Länge, Position, Inhalt) -> Prozent
("Flugzeug", "Affe") -> (4, ?, 2) -> ?
("Affe", "Affe") -> (100%, 67%, 3) -> ?
("Flugzeug", "Flugzeug") -> (?, ?, ?) -> ?
("abc", "cb") -> (?, ?, ?) -> ?

In meiner Lösung sollte deutlich werden wie es funktionieren soll.
crouser 4. Februar 2014 11:28   reply report
Fehler im ersten Satz... meinte nicht gibt sondern finde.
crouser 4. Februar 2014 11:27   reply report
So peinlich es mir auch ist, muss ich zugeben, dass ich selbst nach längerer Suche nicht die Funktion zum abändern der Aufgabe gibt. Ich nenne hier mal ein paar Beispiele:

Hauptkette: Flugzeug
Nebenkette: Affe

Länge: die Hauptkette hat eine Länge von 8 Zeichen. D.h. hat die Nebenkette 8 Zeichen treffen 100% zu, hat sie 0 oder >15 Zeichen treffen 0% zu. In diesem Fall hat Affe 4 Zeichen. Von 8 Zeichen ist ein Buchstabe (100/8) 12,5%. 4*12,5=50% -> Affe bekommt 50% für den Längenabgleich

Position: Da Affe die kürzere Kette ist, müssen für die Position auch nur die ersten 4 Zeichen verglichen werden. Es wird trotzdem wieder mit den 12,5% pro Zeichen das stimmt gerechnet, da die Hauptkette torztdem ja immernoch 8 Zeichen fasst. Affe und Flug stimmen an keiner Stelle überein, daher 0 * 12,5% -> Affe bekommt 0% für die Positionsgleichheit

Inhalt: Hierbei wird die gesamte Hauptkette durchlaufen. Affe wird auf die Zeichen gekürtzt, die tatsächlich enthalten sind, also Afe. Flugzeug bleibt Flugzeug. Wenn nun die Hauptkette durchlaufen wird, wird jedes mal wenn ein A,f oder e vorkommt, +12,5% gerechnet. A kommt nicht vor, f und e jeweils 1 Mal. -> 2*12,5% -> Affe bekommt für den Inhalt 25%

Von diesen 3 Prozentwerden bilden wir den Mittelwert ((25+0+50)/3) und kommen daher auf 25%.

Affe stimmt also laut unserer Rechnung zu einem Viertel mit Flugzeug überein.
gressly 31. Januar 2014 11:22   reply report
Bitte um einige Verifikationen, damit ich mein Programm auch testen kann, bevor ich die Lösung hochlade.

Beispiel so:
(Hauptkette, Nebenkette) -> (Länge, Position, Inhalt) -> Prozent
("Flugzeug", "Affe") -> (4, ?, 2) -> ?
("Affe", "Affe") -> (100%, 67%, 3) -> ?
("Flugzeug", "Flugzeug") -> (?, ?, ?) -> ?
("abc", "cb") -> (?, ?, ?) -> ?

9 Lösung(en)

Diese Lösung ist mit Visual Studio 2010 erstellt
Einfach eine neue Form in ein Projekt einfügen und den Code reinkopieren.
Kann noch durch Textfelder ergänzt werden die habe ich mir aber gespart. Viel Spass damit

Imports System.Text.RegularExpressions
Public Class frm_zeichenketten
    Dim strhaupttext As String = ""
    Dim strvergleichstext As String = ""
    Dim lnghauptlaenge As Long = 0
    Dim lngvergleichslaenge As Long = 0
    Dim lnganzIdentpos As Long = 0
    Dim lnganzidentchar As Long = 0
    Dim dblproz As Double = 0
    Dim dblprozgleich As Double = 0
    Dim dblprozident As Double = 0
    Property Haupttext As String
        Get
            Return strhaupttext
        End Get
        Set(value As String)
            strhaupttext = value.Trim
        End Set
    End Property
    Property Vergleichstext As String
        Get
            Return strvergleichstext
        End Get
        Set(value As String)
            strvergleichstext = value.Trim
        End Set
    End Property
    Property Hauptlaenge As Long
        Get
            Return lnghauptlaenge
        End Get
        Set(value As Long)
            lnghauptlaenge = value
        End Set
    End Property
    Property Vergleichslaenge As Long
        Get
            Return lngvergleichslaenge
        End Get
        Set(value As Long)
            lngvergleichslaenge = value
        End Set
    End Property
    Property AnzIdentchar As Long
        Get
            Return lnganzidentchar
        End Get
        Set(value As Long)
            lnganzidentchar = value
        End Set
    End Property
    Property AnzIdentpos As Long
        Get
            Return lnganzIdentpos
        End Get
        Set(value As Long)
            lnganzIdentpos = value
        End Set
    End Property
    Property Prozentual As Double
        Get
            Return dblproz
        End Get
        Set(value As Double)
            dblproz = value
        End Set
    End Property
    Property ProzentualGleich As Double
        Get
            Return dblprozgleich
        End Get
        Set(value As Double)
            dblprozgleich = value
        End Set
    End Property
    Property ProzentualIdent As Double
        Get
            Return dblprozident
        End Get
        Set(value As Double)
            dblprozident = value
        End Set
    End Property

    Public Sub New()

        ' Dieser Aufruf ist für den Designer erforderlich.
        InitializeComponent()
        Me.Haupttext = "The Quick Brown Fox jumps over the lazy dog"
        Me.Vergleichstext = "The Quick Brown xox jumps over the lazy dog"
        'Anzahl Zeichen Haupttext
        Me.Hauptlaenge = Me.Haupttext.Length
        'Anzahl Zeichen Vergleichstext
        Me.Vergleichslaenge = Me.Vergleichstext.Length
        'Wie groß ist die Gesamte Prozentuale Übereinstimmung
        Select Case Me.Hauptlaenge - Me.Vergleichslaenge
            Case 0 'Textlänge gleich
                Me.Prozentual = 100
            Case Is > 0 'Vergleichstext ist kleiner als der Haupttext
                Me.Prozentual = Me.Vergleichslaenge * 100 / Me.Hauptlaenge
            Case Is < 0 'Vergleichstext ist größer als der Haupttext
                Me.Prozentual = 100 - (100 - (Me.Vergleichslaenge * 100 / Me.Hauptlaenge))
        End Select
        'Wenn der Vergleichstext mehr als doppelt so groß ist wie der Haupttext
        'wird der Prozentwert negativ
        If Me.Prozentual < 0 Then Me.Prozentual = 0

        'Alle Zeichen in ein Array umwandeln
        Dim CharArray = Me.Vergleichstext.ToCharArray
        Dim HauptCharArray = Me.Haupttext.ToCharArray
        Dim CharArrayResult As New List(Of Char)
        'Umwandeln in eine List(of Char) die keine doppelten Chars enthält
        For Each myElement As Char In CharArray
            If CharArrayResult.Contains(myElement) = False Then
                CharArrayResult.Add(myElement)
            End If
        Next
        'Jetzt über reguläre Ausdrücke Vergleichen und die Anzahl des Vorkommens ermitteln
        Dim regExp As Regex
        Dim mc As MatchCollection
        For Each Element As Char In CharArrayResult
            regExp = New Regex(Element)
            mc = regExp.Matches(Me.Haupttext)
            If mc.Count > 0 Then
                Me.AnzIdentchar = Me.AnzIdentchar + mc.Count
            End If
        Next
        'Wie groß ist die Prozentuale Übereinstimmung gleicher Zeichen
        Select Case Me.Hauptlaenge - Me.AnzIdentchar
            Case 0 'Textlänge gleich
                Me.ProzentualGleich = 100
            Case Is > 0 'Vergleichstext ist kleiner als der Haupttext
                Me.ProzentualGleich = Me.AnzIdentchar * 100 / Me.Hauptlaenge
            Case Is < 0 'Vergleichstext ist größer als der Haupttext
                Me.ProzentualGleich = 100 - (100 - (Me.AnzIdentchar * 100 / Me.Hauptlaenge))
        End Select
        If Me.ProzentualGleich < 0 Then Me.ProzentualGleich = 0

        'Positionen berechnen
        Dim intNebenIndex As Integer = 0
        'Sind beide Texte Identisch
        Dim equal As Boolean = HauptCharArray.SequenceEqual(CharArray)
        'Nein dann genauer hinschauen ob char und Position übereinstimmen

        If equal = False Then
            For Each myElement As Char In CharArray
                Dim intHauptIndex As Integer = -1
                intHauptIndex = Me.Haupttext.IndexOf(myElement.ToString, intNebenIndex, 1)
                If intHauptIndex >= 0 Then
                    'Übereinstimmung der Position
                    If intNebenIndex = intHauptIndex Then
                        Me.AnzIdentpos = Me.AnzIdentpos + 1
                    End If
                End If
                intNebenIndex = intNebenIndex + 1
            Next
        Else
            'Kann nur auftreten wenn beide Texte Gleich sind
            Me.AnzIdentpos = Me.Haupttext.Length
        End If
        Select Case Me.Hauptlaenge - Me.AnzIdentpos
            Case 0 'Textlänge gleich
                Me.ProzentualIdent = 100
            Case Is > 0 'Vergleichstext ist kleiner als der Haupttext
                Me.ProzentualIdent = Me.AnzIdentpos * 100 / Me.Hauptlaenge
            Case Is < 0 'Vergleichstext ist größer als der Haupttext
                Me.ProzentualIdent = 100 - (100 - (Me.AnzIdentpos * 100 / Me.Hauptlaenge))
        End Select
        If Me.ProzentualIdent < 0 Then Me.ProzentualIdent = 0
        MessageBox.Show("Übereinstimmung der Textlängen:" & Format(Me.Prozentual, "0.00") & "% ;Anzahl Identischer Zeichen:" & Format(Me.ProzentualGleich, "0.00") & "% ;Anzahl:" & Me.AnzIdentchar & ";Position:" & Format(Me.ProzentualIdent, "0.00") & "Anzahl:" & Me.AnzIdentpos, "Auswertung", MessageBoxButtons.OK)
    End Sub

End Class
                

Lösung von: Klaus Raykowski (OMM-Systems)

public double compareStrings(String mainString, String toCompareString, boolean ignoreCase) {

        // Wenn true wird Groß-Kleinschreibung ignorriert
        if (ignoreCase) {
            mainString = mainString.toUpperCase();
            toCompareString = toCompareString.toUpperCase();
        }

        // Längenwerte
        int mainstringlength = mainString.length();
        int tocomparestringlength = toCompareString.length();
        int smallerlength;

        // Wie viel Prozent ein einzelner Buchstabe ausmacht
        double percent = 100 / mainstringlength;

        // Prozentwerte der einzelnen Überprüfungen
        double position;
        double contains;
        double length;

        /*
         * 
         * 
         * Überprüfung des Längenwerts
         */
        if (mainstringlength > tocomparestringlength) {
            length = tocomparestringlength * percent;
            smallerlength = tocomparestringlength;
        } else if (mainstringlength < tocomparestringlength) {
            length = (mainstringlength * 2 - tocomparestringlength) * percent;
            smallerlength = mainstringlength;
        } else {
            length = 100;
            smallerlength = mainstringlength;
        }

        /*
         * Sollte der zu überprüfende String keine Länge haben oder mehr als
         * doppelt so groß wie der Hauptstring sein, wird length zu 0%
         */
        if (length < 0) {
            length = 0;
        }

        /*
         * 
         * 
         * Überprüfung des Positionswert
         */

        // Beide Strings als char[]
        char[] mainarray = mainString.toCharArray();
        char[] comparearray = toCompareString.toCharArray();

        // Zählt mit wie oft enthalten
        int counter = 0;

        // Durchläuft das kleinere Array und zählt Übereinstimmungen
        for (int i = 0; i < smallerlength; i++) {
            if (mainarray[i] == comparearray[i]) {
                counter++;
            }
        }
        position = counter * percent;

        /*
         * 
         * 
         * Überprüfung des Inhalts
         */

        // Zähler wird ein zweites mal genutzt
        counter = 0;

        // Beinhaltet alle chars des Vergleichstrings (keine doppelten)
        String keys = "";
        for (int i = 0; i < tocomparestringlength; i++) {
            if (!keys.contains(String.valueOf(comparearray[i]))) {
                keys = keys + String.valueOf(comparearray[i]);
            }
        }

        // Zählt Übereinstimmungen
        for (int i = 0; i < mainstringlength; i++) {
            if (keys.contains(String.valueOf(mainarray[i]))) {
                counter++;
            }
        }
        contains = counter * percent;

        /*
         * Zählt die 3 Prozentwerde zusammen und gibt das Ergebniss geteilt
         * durch 3 wieder
         */
        double percentOfSimilarity = Math.round((length + position + contains) / 3 * 100);
        percentOfSimilarity = percentOfSimilarity / 100;
        return percentOfSimilarity;
    }
                

Lösung von: Sebastian Littel ()

//----------------------------------------------
// Einfache WindowsFormsApplication mit:
// 2x textbox, 1x checkbox, 9x label, 1x button
//----------------------------------------------

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ZeichenkettenVergleichen
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Int32 i = 0;
            Int32 i2 = 0;
            Double count = 0;

            String s1 = textBox1.Text;
            String s2 = textBox2.Text;




            //grosskleinschreibung
            if (!checkBox1.Checked)
            {
                s1 = s1.ToLower();
                s2 = s2.ToLower();
            }




            //länge
            Double l1 = s1.Count();
            Double l2 = s2.Count();

            Double lprozent = 0;

            lprozent = l2 / l1 * 100;

            label6.Text = "Die Länge der Zeichenkette 2 beträgt " + lprozent + "% der Länge der Zeichenkette 1";




            //position
            Char[] s1a = s1.ToCharArray();
            Char[] s2a = s2.ToCharArray();
            
            Double pprozent = 0;

            if (lprozent > 100)
            {
                i2 = s1a.Count();
            }
            else if(lprozent<=100)
            {
                i2 = s2a.Count();
            }

            while ( i < i2)
            {
                if(s1a[i]==s2a[i])
                {
                    count += 1;                    
                }
                i += 1;
            }

            pprozent =   count/Convert.ToDouble(s1a.Count()) * 100;
            label7.Text = pprozent + " Prozent der Zeichen in Zeichenkette 1 befinden sich an der selben Stelle wie in Zeichenkette 2.";




            //inhalt
            Char[] s2da = s2.Distinct().ToArray();
            Char[] s1da = s1.Distinct().ToArray();
            Int32 s2dcount = s2da.Count();
            Int32 s1dcount = s1da.Count();

            i = 0; 
            i2 = 0; 
            count = 0;

            Double iprozent = 100 / s1da.Count();

            while (i < s2dcount)
            {
               while(i2 < s1dcount)
               {
                   if(s1da[i2] == s2da[i])
                   {
                       count += 1;
                   }
                   i2 += 1;
               }
               i += 1;
               i2 = 0;
            }
            label8.Text = (iprozent * count) + "% der Zeichen in Zeichenkette 1 kommen auch in Zeichenkette 2 vor";




            //Total
            if(lprozent > 100)
            { 
                lprozent = 100 / lprozent * 100;
            }
            Double total = (lprozent + pprozent + iprozent)/3;
            label9.Text = "Zeichenkette 1 stimmt zu " + total + "% mit Zeichenkette 2 überein.";
        }
    }
}
                

Lösung von: Manuel Burkard (Internet)

using System;
using System.Linq;

namespace charMatch
{
    class Program
    {
        static void Main(string[] args)
        {
            int contentCount = 0;
            int positionCount = 0;

            Console.WriteLine("case sensitive? y/n: ");
            bool isCaseSensitive = Console.ReadLine() == "y" ? true : false;

            Console.WriteLine( "Main string?: " );
            string mainString = Console.ReadLine();
            Console.WriteLine( "Other string?: ");
            string otherString = Console.ReadLine();

            if ( !isCaseSensitive )
            {
                mainString = mainString.ToLower();
                otherString = otherString.ToLower();
            }

            // length
            double procentLength = ( Convert.ToDouble(otherString.Length) / Convert.ToDouble(mainString.Length) ) * 100;
            Console.WriteLine("Length: {0}", procentLength);

            // position
            for (int i = 0; i < mainString.Length; i++) {
                for (int j = 0; j < otherString.Length; j++) {
                    if ( procentLength <= 100 && i > otherString.Length )
                        break;
                    if ( ( i == j ) && ( mainString[i] == otherString[j] ) )
                        positionCount++;
                }
            }

            double procentPosition = ( positionCount / Convert.ToDouble( mainString.Length ) ) * 100;
            Console.WriteLine("Position: {0}", procentPosition);

            // content
            for (int i = 0; i < mainString.Length; i++) {
                if ( otherString.Contains(mainString[i]) )
                    contentCount++;
            }

            double procentContent = ( contentCount / Convert.ToDouble(mainString.Length )) * 100;
            Console.WriteLine( "Content: {0}", procentContent );

            // total
            double procentTotal = (procentLength + procentPosition + procentContent) / 3;
            Console.WriteLine("Total: {0}", procentTotal);
        }
    }
}

                

Lösung von: Lukas -- (-)

import java.util.Scanner;


public class KettenAbgleich 
{
	private static Scanner scan;
	
	public static void main(String[] args)
	{
		scan = new Scanner(System.in);
		
		System.out.println("Geben sie die zeichenkette Nummer 1 an.");
		String chars1 = scan.nextLine();
		
		System.out.println("Geben sie die zeichenkette Nummer 2 an.");
		String chars2 = scan.nextLine();
		
		System.out.println("Der Unterschied beträgt: "+checkStrings(chars1, chars2)+" %");
	}
	
	public static double checkStrings(String char1, String char2)
	{
		System.out.println("Wollen sie Groß- und Kleinschreibung aktivieren? j/n ");
		String r = scan.next();
		if(r.contains("j")) 
		{
			char1.toLowerCase();
			char2.toLowerCase();
		}
		
		double length = checkLength(char1,char2);
		System.out.println("Länge: "+length+" %");
		double position = checkPosition(char1,char2);
		System.out.println("Position: "+position+" %");
		double inhalt = checkSpelling(char1,char2);
		System.out.println("Inhalt: "+inhalt+" %");
		
		return (length+position+inhalt)/3;
	}
	
	public static double checkLength(String chars1, String chars2)
	{
		if( chars1.length() > chars2.length() )
		{
			double percPerChar = (double)100/chars1.length();
			return percPerChar*chars2.length();
		}	
		else 
		{
			double percPerChar = (double)100/chars2.length();
			return percPerChar*chars1.length();
		}
	}
	
	public static double checkPosition(String chars1, String chars2)
	{
		double percPerChar = 0;
		
		if( chars1.length() > chars2.length() )	percPerChar = (double)100/chars1.length();
		else percPerChar = (double)100/chars2.length();
			
		if(chars1.length() < chars2.length())
		{
			String tmp = chars1;
			chars1 = chars2;
			chars2 = tmp;
		}
		
		int count = 0;
		
		for( int i = 0; i < chars2.length(); i++)
		{
			if(chars1.charAt(i) == chars2.charAt(i))
			{
				count++;
			}
		}
		
		return count*percPerChar;
	}
	
	public static double checkSpelling(String chars1, String chars2)
	{
		String tmp = "";
				
		if(chars1.length() < chars2.length())
		{
			String t = chars1;
			chars1 = chars2;
			chars2 = t;
		}
		
		double percPerChar = (double)100/chars1.length();
		
		for(int i = 0; i < chars2.length();  i++)
		{
			for(int j = 0; j < chars2.length(); j++)
			{
				if(chars2.charAt(i) == chars2.charAt(j) && i != j )
				{
					tmp = "";
					
					for(int k = 0; k < j; k++) tmp += chars2.charAt(k);
					
					for(int k = j; k < chars2.length()-1; k++)
					{
						tmp += chars2.charAt(k+1);
					}
					break;
				}
			}
		}		
		
		int count = 0; 
		for( int i = 0; i < chars1.length(); i++)
		{
			for(int j = 0; j < tmp.length(); j++)
			{
				if(chars1.charAt(i) == tmp.charAt(j)) count++;
			}
		}
		
		return percPerChar*count;
	}
}

                

Lösung von: Daniel Hu (Ludwig-Geissler-Schule )

'''
habe nur old-Style Programmieren gelernt. Freue mich über Anregungen, die Lösung in Python simpler zu realisieren
'''
# -*- coding: utf-8 -*-
import string

caseSensitiv = "0"
f_gesamtProzent = "{0:.2f}"                        # Ausgabeformat

def inhalt(kettekurz,kettelang):
	treffer = 0
	anzkettekurz = len(kettekurz)
	anzkettelang = len(kettelang)
	listelang = []
	for i in range (0,anzkettelang,1):                    # lange Zeichenkette zeichenweise in Liste umwandeln
		listelang += kettelang[i]

	for i in range (0,anzkettekurz,1):                    # kurze Zeichenkette verarbeiten
		for j in range (0,anzkettelang,1):                # lange Zeichenkette verarbeiten
			if kettekurz[i] == listelang[j]:
				treffer += 1
				listelang[j] = " "                      # verarbeitetes Zeichen entfernen
	return treffer


# Benutzerentscheidung für Groß-/Kleinschreibung oder nicht
while caseSensitiv not in "J,j,Y,y,N,n":
	caseSensitiv = raw_input("Soll Groß-/Kleinschreibung beachtet werden? J,j,Y,y,N,n\n")


# Eingabe der zu prüfenden Zeichenketten und ggf. Umwandlung in nicht case sensitiv
hauptKette = raw_input("Bitte Hauptkette eingeben: ")
lhauptk = len(hauptKette)
nebenKette = raw_input("Bitte Nebenkette eingeben: ")
lnebenk = len(nebenKette)
if caseSensitiv in "N,n":
	hauptKette = string.lower(hauptKette)
	nebenKette = string.lower(nebenKette)


# Verarbeiten der Länge
if lnebenk == lhauptk:              # Nebenkette genau so lang wie Hauptkette = 100%
	prozentLen = 100
elif lnebenk == 0:                          # leere Nebenkette = 0%
	prozentLen = 0
elif lnebenk > (lhauptk * 2):       # Nebenkette mehr als doppelt so lang wie Hauptkette = 0%
	prozentLen = 0
elif lnebenk > lhauptk:
	prozentLen = 100 - ((100. / lhauptk) * (lnebenk - lhauptk))
else:
	prozentLen = (100. / lhauptk) * lnebenk



# Verarbeiten der Zeichenpositionen
treffer = 0                                 # Anzahl identischer Zeichen mit gleicher Position
if lhauptk <= lnebenk:                      # die kürzeste Zeichenkette bestimmt die Verarbeitungslänge
	anzZeichen = lhauptk
else:
	anzZeichen = lnebenk
for i in range (0,anzZeichen,1):
	if hauptKette[i:i+1] == nebenKette[i:i+1]:
		treffer += 1
prozentPos = (100. / lhauptk) * treffer


# Verarbeiten des Inhalts
treffer = 0                                 # Anzahl identischer Zeichen mit ungleicher Position
if lhauptk <= lnebenk:                      # die kürzeste Zeichenkette bestimmt die Verarbeitungslänge
	treffer = inhalt(hauptKette,nebenKette)
else:
	treffer = inhalt(nebenKette,hauptKette)
prozentInh = (100. / lhauptk) * treffer



# Ausgabe der einzelnen Prozente und des Gesamtergebnisses
print 'Erreichte Prozent bei Länge: ', prozentLen
print 'Erreichte Prozent bei Position: ', prozentPos
print 'Erreichte Prozent bei Inhalt: ', prozentInh
print 'Erreichte Gesamtprozent: ', f_gesamtProzent.format((prozentLen + prozentPos + prozentInh) / 3), '\n'
                

Lösung von: J. Reppe ()

function compareString(str, compStr, caseSensitive) {
  // default: keine unterscheidung von groß- und kleinschreibung
  caseSensitive = caseSensitive || false;
  var pLen, pPos = 0, pCont = 0,
      unit = 100 / str.length,
      tmp;
  if (!caseSensitive) {
    str = str.toUpperCase(); compStr = compStr.toUpperCase();
  }
  // länge
  tmp = unit * compStr.length;
  if (tmp > 200) pLen = 0;
  else if (tmp > 100) pLen = 200 - tmp;
  else pLen = tmp;
  // position
  for (tmp = 0; tmp < Math.min(str.length, compStr.length); tmp++)
    if (str[tmp] === compStr[tmp]) pPos += unit;
  // inhalt
  for (tmp = 0; tmp < str.length; tmp++) {
    if (compStr.indexOf(str[tmp]) > -1) pCont += unit;
  }
  // rückgabe des durchschnitts in prozent
  return ((pLen + pPos + pCont) / 3).toFixed(2);
}

console.log(compareString("Flugzeug", "Affe"));     // 25.00
console.log(compareString("Affe", "Affe", true));   // 100.00
console.log(compareString("Affe", "affe", true));   // 83.33

                

Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)

// NET 6.x | C# 10.x | VS-2022

double GetPercentOfComparison(string mainStr, string sideStr , bool caseSen = false) {
    double mainLen = mainStr.Length, sideLen = sideStr.Length;

    if (!caseSen) { mainStr = mainStr.ToLower(); sideStr = sideStr.ToLower(); }

    var per = 100 / mainLen * sideLen;
    var facPer = (per > 200 ? 0 : (100 - per % 100)) / sideLen;
    var facPos = Enumerable.Range(0, (int)Math.Min(sideLen, mainLen)).Where(x => mainStr[x] == sideStr[x]).Count();
    var facCon = new HashSet<char>(sideStr.ToCharArray()).SelectMany(x => mainStr.Where(y => x == y).ToList()).Count();

    return Math.Round(facPer * (sideLen + facPos + facCon) / 3.0, 2);
}

Console.WriteLine(GetPercentOfComparison("Flugzeug", "affe"));
Console.WriteLine(GetPercentOfComparison("Flugzeug", "Flugzeug", true));
Console.WriteLine(GetPercentOfComparison("Flugzeug", "flUgzEUg", true));
                

Lösung von: Jens Kelm (@JKooP)

// C++ 17

#include <iostream>
#include <string>
#include <algorithm>
#include <set>
#include <vector>

void to_lower(std::string& str) {
    std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c) { return std::tolower(c); });
}

double get_percent_of_string_comparison(std::string main_str, std::string side_str, bool case_sensitive = false) {
    unsigned long long main_length{ main_str.length() }, side_length{ side_str.length() };

    if (!case_sensitive) { to_lower(main_str); to_lower(side_str); }

    const auto& per{ 100.0 / main_length * side_length };
    auto fac_per{ per > 200 ? 0.0 : (100 - (double)((int)per % 100)) / side_length };

    auto fac_pos{ 0 };
    for (auto i{ 0 }; i < std::min(side_length, main_length); i++)
        if (main_str[i] == side_str[i]) fac_pos++;

    auto fac_con{ 0 };
    for (const auto& s : std::set<char>{ begin(side_str), end(side_str) })
        for (const auto& v : main_str )
            if (s == v) fac_con++;

    return fac_per * (side_length + fac_pos + fac_con) / 3.0;
}

int main() {
    std::cout << get_percent_of_string_comparison("Flugzeug", "affe") << "\n";              // 25
    std::cout << get_percent_of_string_comparison("Flugzeug", "Flugzeug", true) << "\n";    // 100
    std::cout << get_percent_of_string_comparison("Flugzeug", "flUgzEUg", true) << "\n";    // 66,67
}
                

Lösung von: Jens Kelm (@JKooP)

Verifikation/Checksumme:

 

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 0.25
Schwierigkeit: Mittel
Webcode: xv2c-hujv
Autor: ()

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen