String Funktionen
-
Tachyon schrieb:
Dann solltest Du ein zweites Array mit 26 Elementen anlegen (vom Typ int, oder besser size_t). Jedes Arrayelement initialisierst Du mit 0.
Jedes Element entspricht einem Buchstaben (also von 'a'-'z').
Dann gehst Du Buchstabe für Buchstabe durch Deinen Satz. Für jeden Buchstaben zählst Du im Array an der entsprechenden Stelle um 1 hoch. Anschließend zählst Du die Anzahl an Elementen die größer oder gleich 2 ist. Der Wert der dabei rauskommt, ist die Anzahl der doppelten Buchstaben.Es geht auch einfacher:
int doubles (char *str) { int d = 0; while (*++str) if (*str == *(str-1) && *str != *(str+1)) d++; return d; }
-
C++fan 2009 schrieb:
...
Jo, das ist besser. Ich zähle das doppelte Vorkommen von Buchstaben im gesamten Satz. In der Aufgabe geht es aber wohl tatsächlich um die Doppelbuchstaben.
-> Hab' Aufgabe nicht richtig gelesen/verstanden.

-
Jetzt stellt sich die Frage, ob das "fff" als zwei Doppel, ein Doppel oder als Tripel (ergo: gar nicht) gewertet werden muss, damit die Aussage des zu prüfenden Satzes wahr ist. Oder die Aufgabe stammt aus der Zeit vor der Rechtschreibreform und wurde lediglich "korrigiert".
Möglichkeit 1: "ff" (1. + 2. Stelle) + "ff" (2. und 3. Stelle) = zwei Doppel
Möglichkeit 2: "ff" (1. + 2. Stelle, 3. Stelle wird ignoriert) = ein Doppel
Möglichkeit 3: "fff" = Tripel (keine Wertung)Möglichkeiten 1 und 3 führen zu einer falschen Aussage des Satzes.
Das waren meine ersten Gedanken, als ich die Aufgabenstellung las.

Grüße... Heiko
-
Was*serstof*f*flasche
sind doch drei.
-
Was*serstof*f*flasche hat drei Doppel => 3
Was*serstof*f*flasche hat drei Dop*pel => 4Es kommt wohl wieder auf den Standpunkt der Betrachtung an.
Das könnte mitunter ein Grund sein, dass ich mit Dozenten nie einer Meinung bin.
Grüße... Heiko
-
"Was*serstof*f*flasche" hat drei Dop*pel
und
"Was*serstof*f*flasche hat drei Dop*pel" hat vier Dop*pel
-
Okay, ich bin überzeugt

-
Also zu dem Standartkonformen "main" einweisung ...kann ich nur sagen, die schreibe ich ja nicht von hand sondern macht Borland.... und naja es tut ja...
Und die Aufgabe besagt das das "fff" dazu führt das das dann 2 Doppelte Stellen sind...
lg stan
-
Stanislas schrieb:
Also zu dem Standartkonformen "main" einweisung ...kann ich nur sagen, die schreibe ich ja nicht von hand sondern macht Borland.... und naja es tut ja...
derzeit ist es noch nötig, bevor du eine schwierige frage in einem forum stellt, daß du die int _tmain() oder void main() oder dergleichen vorher noch zu int main() machst. machte das nicht, wirste erstmal zurechgewiesen.
das ist aber kein compiler- oder sprachproblem, sondern ein soziales.
-
Also dank für die antworten, haben mir die Augen geöffnet das ich einfach nur dumm bin..... Habe in die Kompliziertesten Richtungen gedacht und gerätzelt, obwohl es auch einfach in 4 minuten machbar ist...
char cSatz[] = "Wasserstoffflasche hat drei Doppel"; //Vorgabe des satzes aus der Aufgabe 2 [=> 34 Zeichen...] int iAnzahl = 0; //Für die Anzahl der Doppelten Buchstaben for (int i = 0; i < 34; i++) { if (cSatz[i] == cSatz[i+1]) { iAnzahl++; } } printf("\nEs sind %i Dopplungen....", iAnzahl); getch();Danke für die hilfe..... Wäre noch stunden in den String Funktion rumgeschwommen

LG Stan
-
hab jz nich alles davor gelesen, aber vll kams ja wirklich noch nicht...
ich hoff einfach ma, dass du noch ma hier bist, damit ich es net ganz um sonst geschrieben hab ^^char cSatz[] = "Wasserstoffflasche hat drei Doppel"; int anzahl = 0; //Für die Anzahl der Doppelten Buchstaben for (int i(0), e(strlen(cSatz)); i != e; i++) { if (cSatz[i] == cSatz[i+1]) { anzahl++; } } std::cout << "\nEs sind " << anzahl << " Dopplungen...." << std::endl; getch();würde aber btw auch toll mit for_each gehen ^^
bb
-
Um zum Problem zurück zu kommen:
Es reicht vollkommen aus, wenn du deine Zeichenkette zeichenweise durchläufst und abprüfst, ob das aktuelle Zeichen (n) mit dem nachfolgende Zeichen (n+1) übereinstimmt. Ist dies der Fall, inkrementierst du deinen Doppel-Zähler.
Die Herausforderung besteht darin, festzulegen, wie groß n maximal werden darf, so dass die Bereichsgrenze der Zeichenkette nicht überschritten wird und es so (im besten Fall) zu einer Zugriffsverletzung kommt.
Hinweis: Die Länge solltest du nicht "hard-coden" (34) sondern bessern ermitteln lassen. So musst du dich nicht durch den gesamten Quelltext hangeln, nur weil du deine zu prüfende Zeichenkette verändert hast (wiederverwendbarer Quelltext).
Tipp: C-Strings schließen mit einer Null (0 oder '\0') ab. Man spricht daher auch von nullterminierten oder zero-terminated strings: "Hallo Welt" ist daher eigentlich "Hallo Welt\0"
Edit: Ich sehe, du hast schon eine Lösung gefunden. Trotzdem gilt der "Hinweis" weiterhin

Ansonsten noch viel Erfolg beim Basteln.

Grüße... Heiko
-
Hey Unskilled,
Keine Sorge, bin noch da, Und ja deine "Erweiterung ist auch nett" nur in dem Sinne für die aufgabe net erforderlich da es ja ne Prüfung ist, dh jede Sekunde Zählt^^...
Ne also ich meine was net in der Aufgabenstellung gefragt wird wird nur aks mehr aufwand gesehen (Aufwand == Zeit).
Aber danke
LG stan
-
volkard schrieb:
derzeit ist es noch nötig, bevor du eine schwierige frage in einem forum stellt, daß du die int _tmain() oder void main() oder dergleichen vorher noch zu int main() machst. machte das nicht, wirste erstmal zurechgewiesen.
das ist aber kein compiler- oder sprachproblem, sondern ein soziales.Das könnte auch daran liegen, dass man dem Threadersteller helfen will, schliesslich waren es freundliche Tipps und kein Zurechtweisen. Genauso wie der Hinweis, er würde nicht C++ verwenden. Was nützt es ihm, wenn er im Glauben bleibt, modernes Standard-C++ zu programmieren, aber in der Tat weit davon entfernt ist?
-
volkard schrieb:
das ist aber kein compiler- oder sprachproblem, sondern ein soziales.
oha, und sowas von volkard. ein lexikonreifes beispiel für ironie!

-
Nexus schrieb:
volkard schrieb:
derzeit ist es noch nötig, bevor du eine schwierige frage in einem forum stellt, daß du die int _tmain() oder void main() oder dergleichen vorher noch zu int main() machst. machte das nicht, wirste erstmal zurechgewiesen.
das ist aber kein compiler- oder sprachproblem, sondern ein soziales.Das könnte auch daran liegen, dass man dem Threadersteller helfen will, schliesslich waren es freundliche Tipps und kein Zurechtweisen. Genauso wie der Hinweis, er würde nicht C++ verwenden. Was nützt es ihm, wenn er im Glauben bleibt, modernes Standard-C++ zu programmieren, aber in der Tat weit davon entfernt ist?
oft schießen die c++-jünger weit über das ziel hinaus und empfehlen, erstmal das nullterminierte char-array in einen std::string zu stopfen, dann mit std::string::iterator drüberzulaufen, wenns ganz böse kommt, noch die schleife durch anderelib::foreach zu ersetzen, ups warum nicht std::count_if mit equal_to, logical_and, less_equal und bindern, das geht alles in einem ausdruck.
eigentlich reicht eine recht simple schleife, die einen char* laufen läßt. der AHA-effekt, daß programmieren ja gar nicht weh tun muß, den setze ich gegen masochisischen stil. ich bin ganz sicher, daß jeder neuling in den ersten monaten des forum- oder newsgroup-lesens schon mitkriegt, daß int main() zu bevorzugen ist. warum muß das in fast thread jedem kommen? da würde auch jeder fünfzigste völlig reichen.
-
volkard schrieb:
warum muß das in fast thread jedem kommen? da würde auch jeder fünfzigste völlig reichen.
nur, weil du jeden thread liest, heißt es noch lang nicht, dass er es auch tut...
ich finds zwar jz hier au bissl sinnfrei, die (offensichtlich) compiler-generierte variante abzulehnen, aber so lang es nicht der ganze inhalt des posts war (und es war ja nur ein ps), find ichs optimal...bb