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
Hallo, mach z.Bsp. mit atoi deine Strings zu Zahlen, dann lassen die sich besser rechnen :-) Grüße aus Berlin
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 ...
> 21111 - 11211
21111
11211
^^^^^
||||-----gleich
|||------gleich
||-------ungleich
|--------gleich
---------ungleich
Wuerde in dem Fall dann 60% Uebereinstimmung bedeuten
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.
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.
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. ;-)
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.
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.
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.
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%.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.