Forum: Compiler & IDEs String Vergleichen und Differenz in prozent ausgeben


von Lyly (Gast)


Lesenswert?

Hallo Zusammen,

ich moechte gerne 2 String aus Zahlen vergleichen und das Ergebnis in 
Prozent Ausgabe darstellen. D.h wenn beide String unterschiedlich sind, 
dann die Differenz in der Form: (strLength1 -strLength2)/100

char strLength1[]="920";
char strLength2[]="890";
char strDiffValue[]="";

if(strcmp(strLength1, strLength2) == 0)
{
  strDiffValue="0%";
}
else
{
   strDiffValue="0.3%";
}
Bitte kann jemanden mir zeigen, wie ich am besten so eine Funktion 
schreiben kann.

Danke

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Hallo,

mach z.Bsp. mit atoi deine Strings zu Zahlen, dann lassen die sich 
besser rechnen :-)

Grüße aus Berlin

von Udo S. (urschmitt)


Lesenswert?

Werde dir erst mal klar:
- was ein String ist.
- was der Unterschied zwischen einem String und einer Zahl ist
- in was sich ein String von einem anderen unterscheidet

Stichwort: Länge und Inhalt.

Was soll z.B. rauskommen bei
1234 - 1324
21111 - 11211

...

von Helmut L. (helmi1)


Lesenswert?

> 21111 - 11211

21111
11211
^^^^^
||||-----gleich
|||------gleich
||-------ungleich
|--------gleich
---------ungleich

Wuerde in dem Fall dann 60% Uebereinstimmung bedeuten

von Karl H. (kbuchegg)


Lesenswert?

Helmut Lenzen schrieb:
>> 21111 - 11211
>
> 21111
> 11211
> ^^^^^
> ||||-----gleich
> |||------gleich
> ||-------ungleich
> |--------gleich
> ---------ungleich
>
> Wuerde in dem Fall dann 60% Uebereinstimmung bedeuten

Das wirft eine interessante Fragestellung auf.
Wie gross ist die 'geeignet definierte Differenz' zwischen zb
1
      mayer
2
und   mayr

Sowas ist zb interessant, wenn es um Ähnlichkeitssuche geht. Wir alle 
kennen das Problem: Kundendatenbank. Ohne korrekte Schreibweise des 
Namens ist der Kunde nicht zu finden. Der Sachbearbeiter tippt wie ein 
wilder alle Variationen des Namens ein, die im einfallen, bis er dann 
endlich den gesuchten Kunden findet.

Ich benutz für solche Sachen einen Ähnlichkeitsvergleich, den ich mal in 
den 80-er Jahren in einer c't gefunden habe. Das Prinzip besteht darin, 
festzustellen, wieviele Operationen (verändern, vertauchen, einfügen, 
löschen) von Buchstaben man benötigt, um einen String A in einen String 
B zu überführen. Je kleiner die Zahl, desto ähnlicher.
Funktioniert erstaunlich gut.


Als ich die Überschrift des Threads gelesen hab, dachte ich, der TO 
sucht nach sowas. Mit dem Code war allerdings schnell klar, dass er das 
nicht sucht, sondern dass ihm nicht klar ist, dass "812" auch nur ein 
String ist, so wie "Charly" auch einer ist. Auch wenn ihn "812" an eine 
Zahl erinnert - es ist keine.

von Helmut L. (helmi1)


Lesenswert?

Karl Heinz schrieb:
> Wie gross ist die 'geeignet definierte Differenz' zwischen zb
>       mayer
> und   mayr

Nun ja in dem Fall haengt es davon ab ob man den kuerzen oder den 
laengeren String als Basis nimmt.

Beim kuerzeren:

mayer
mayr
^^^---- ungleich
^^----- gleich
^------ gleich
------- gleich

Wuerde dann 80% entsprechen

Beim laengeren:

mayer
mayr
^^^^---- ungleich
^^^----- ungleich
^^------ gleich
^------- gleich
-------- gleich

hier halt 60%

Karl Heinz schrieb:
> Sowas ist zb interessant, wenn es um Ähnlichkeitssuche geht. Wir alle
> kennen das Problem: Kundendatenbank.

Oder auch das was wir alle immer benutzen: Suchmaschinen.
Das ist ja auch das Problem dabei. Je besser der Algo. ist umso 
treffender das Ergebnis.

Karl Heinz schrieb:
> Als ich die Überschrift des Threads gelesen hab, dachte ich, der TO
> sucht nach sowas.

Ich auch.

von Mark B. (markbrandis)


Lesenswert?

Da nicht so ganz genau klar ist was der Themenersteller denn nun 
eigentlich will, interpretire ich dies halt mal so:

1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4
5
int main()
6
{
7
    char strLength1[]="920";
8
    char strLength2[]="890";
9
    char strDiffValue[10];
10
    
11
    double difference;
12
13
    if(strcmp(strLength1, strLength2) == 0)
14
    {
15
        strcpy(strDiffValue, "0%");
16
    }
17
    else
18
    {
19
        difference = (atoi(strLength1) - atoi(strLength2)) / 100.0;
20
        sprintf(strDiffValue, "%.1f%\%", difference);
21
    }
22
    
23
    printf("strDiffValue: %s\n", strDiffValue);
24
    
25
    return 0;
26
}

Und wenn das falsch ist, schiebe ich es auf unklare Anforderungen. ;-)

von Sven P. (Gast)


Lesenswert?

Karl Heinz schrieb:
> as Prinzip besteht darin,
> festzustellen, wieviele Operationen (verändern, vertauchen, einfügen,
> löschen) von Buchstaben man benötigt, um einen String A in einen String
> B zu überführen.

Das nennt man dan gemeinhin auch Editierdistanz oder 
Levenshtein-Abstand.

von Udo S. (urschmitt)


Lesenswert?

Sven P. schrieb:
> Das nennt man dan gemeinhin auch Editierdistanz oder
> Levenshtein-Abstand.

Genau darauf wollte ich hinaus.
Wobei der Verschiebungen und Vertauschungen nicht erkennt. Es gibt einen 
erweiterten Levensthein, der Vertauschungen erkennt.

Aber da der TO selbst Probleme hat Strings von Zahlen zu unterscheiden 
wird das wohl alles zu kompliziert.

von Helmut L. (helmi1)


Lesenswert?

Udo Schmitt schrieb:
> Aber da der TO selbst Probleme hat Strings von Zahlen zu unterscheiden
> wird das wohl alles zu kompliziert.

Naja Udo, irgendwas Interessantes muessen wir wohl finden sonst wird es 
uns zu langweilig als nur die banale Umwandlung einer Ascii-Ziffer in 
eine Integer.

von Udo S. (urschmitt)


Lesenswert?

Helmut Lenzen schrieb:
> mayer
> mayr
> ^^^^---- ungleich
> ^^^----- ungleich
> ^^------ gleich
> ^------- gleich
> -------- gleich
>
> hier halt 60%

Falsch oder zumindest nicht die gängige Definition.
Bei der Ähnlichkeitssuche geht man im Allgemeinen davon aus, wie viele 
Einfüfeoperationen, Änderungen (eines Zeichens) oder Löschoperationen 
braucht man um einen Wert in den anderen zu überführen.

In dem Beispiel wäre das Löschen des 4. zeichens 'e' die einzige 
Operation, man hätte also den Abstand 1.
Bezogen auf die Wortlänge, besser hier das Minimum beider Wortlängen 
hätte man also einen relativen Abstand von 1/4 = 25% oder als Kehrwert 
die relative Übereinstimmung von 75%.

von Udo S. (urschmitt)


Lesenswert?

Helmut Lenzen schrieb:
> Naja Udo, irgendwas Interessantes muessen wir wohl finden sonst wird es
> uns zu langweilig als nur die banale Umwandlung einer Ascii-Ziffer in
> eine Integer.

:-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.