Forum: PC-Programmierung C++ Zählen von Punkten im String


von Thomas (Gast)


Lesenswert?

Hallo Gemeinde.

Ich habe eine kurze Frage und zwar würde ich gerne die Anzahl der in 
einem std::string enthalten Punkte zählen.

z.B.

std::string  test="ebene1.ebene2.ebene3.ebene4.ebene5"

int fkt(test);

Die Funktion fkt() soll mir nun 4 zurückgeben.

Gibt es hierfür eine einfache Lösung?

Vielen Dank.

von Jonas Biensack (Gast)


Lesenswert?

Alle Zeichen durchlaufen und prüfen ob das aktuelle ein Punkt ist, wenn 
ja einen Zähler erhöhen?
Aller einfachste Kunst....

Gruß Jonas

von Timmo H. (masterfx)


Lesenswert?

genau, das ist ein Einzeiler ;D
1
int fkt(char *test){int i=0;while(*test){if(*test == '.')i++;test++;}return i;}

von Jonas Biensack (Gast)


Lesenswert?

Ach hört doch auf den Kids die Aufgaben zu machen ;)
Den Weg zeigen ist in Ordnung, aber ein bisschen Hirnschmalz gehört 
schon dazu...

Gruß Jonas

von Karl H. (kbuchegg)


Lesenswert?

Thomas schrieb:

> Gibt es hierfür eine einfache Lösung?

künstliche Intelligenz?
neuronale Netze?
Expertensysteme?
Rekursive Lösung?

Was bittte ist an: jedes Zeichen ansehen und wenn es ein '.' ist, einen 
Zähler um 1 erhöhen zu kompliziert, dass man nach einer einfacheren 
Lösung suchen muss?


Stell doch bitte das nächste mal deine richtige Frage. Keine Ahnung 
worum es da geht. VIelleicht kannst du keine Funktion schreiben. 
Vielleicht weißt du auch nicht, wie man einen Text an eine Funktion 
übergibt oder wie man ein Rechenergebnis aus einer Funktion heruas 
bekommt. Oder du weißt nicht wie man eine for-Schleife aufbaut oder ....
Auf jeden Fall: stell nächstes mal deine richtige Frage und versuch sie 
nicht hinter Begriffen wie "einfache Lösung" oder "optimale Lösung" zu 
verstecken. Wir merken das sowieso, das da was nicht stimmt.

Noch eine 'einfache' Lösung, wenn "einfach" kurz bedeuten soll
1
int fkt(char *test){return!*test?0:(*test=='.')+fkt(test+1);}

von Udo S. (urschmitt)


Lesenswert?

Timmo H. schrieb:
> int fkt(char *test){int i=0;while(*test){if(*test == '.')i++;test++;}return i;}
@Thomas:
Das ist kein c++, das ist c

von PisaPaul (Gast)


Lesenswert?

Ja, die Schüler finden hier immer Willige, welche gerne ihr Wissen 
demonstrieren und ihnen die Hausaufgabe machen...
Von "Thomas" werdet ihr nie wieder was hören, nichtmal ein Danke!

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Udo Schmitt schrieb:
> Timmo H. schrieb:
>> int fkt(char *test){int i=0;while(*test){if(*test == '.')i++;test++;}return i;}
> @Thomas:
> Das ist kein c++, das ist c

In 90% aller Fälle ist auch C gemeint, komischerweise wird das aber 
immer als C++ verkauft :-)

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> int fkt(char *test){return!*test?0:(*test=='.')+fkt(test+1);}

Aber dazu muss er, um Rekursion zu verstehen, erst mal Rekursion 
verstehen :-)

von Guest (Gast)


Lesenswert?

Timmo,

Deinen Einzeiler kann man auch in der Breite noch etwas stauchen (von 79 
Zeichen auf 70)
1
int fkt(char *test){int i=0;while(*test)i+=*test++=='.'?1:0;return i;}

von Guest (Gast)


Lesenswert?

Karl Heinz,
erst jetzt gesehen, dass Du es sogar auf 61 Zeichen gebracht hast.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

1
int f(char *s){int i=0;while(*s)i+=*s++=='.'?1:0;return i;}

Ist Referenz schon ein bischen C++? :-)
1
void f(char *s, int &i){while(*s)i+=*s++=='.'?1:0;}

Diese Schrumpfungswettbewerbe sind immer wieder interessant, dem 
Einsteiger nutzen sie eh nix, da er sie nicht lesen kann. Also, warum 
nicht?

von Karl H. (kbuchegg)


Lesenswert?

PisaPaul schrieb:
> Ja, die Schüler finden hier immer Willige, welche gerne ihr Wissen
> demonstrieren und ihnen die Hausaufgabe machen...

Immer langsam mit den jungen Pferden.
Das sind Lösungen, die er sowieso nicht abgeben kann. Das sieht sein 
Lehrer sofort und mit der ersten Nachfrage ist er aufgeschmissen.

von Udo S. (urschmitt)


Lesenswert?

Random ... schrieb:
> Ist Referenz schon ein bischen C++? :-)
Jawoll :-)

von Karl H. (kbuchegg)


Lesenswert?

1
int f(char *s){int i=0;while(*s)i+=*s++=='.'?1:0;return i;}

da geht noch was, wenn du bedenkst, dass ein Vergleich auch ein 
arithmetisches Ergebnis hat. Anstatt *s++=='.'?1:0 kannst du auch 
einfach *s++=='.' benutzen.

von Karl H. (kbuchegg)


Lesenswert?

Random ... schrieb:

> Diese Schrumpfungswettbewerbe sind immer wieder interessant,

Und ausserdem halten sie die grauen Zellen auf Trab :-)

von Εrnst B. (ernst)


Lesenswert?

Und, hat jemand eine "echte" C++ Lösung? mit

#include <algorithm>
#include <functional>

und

std::count_if
std::equal_to

?

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> int f(char *s){int i=0;while(*s)i+=*s++=='.'?1:0;return i;}
>
> da geht noch was...
1
void f(char *s, int &i){while(*s)i+=*s++=='.';}
:-)

Mal schauen, ob am Ende des Tages noch was von der Zeile übrig ist :-)
1
void f(char *s, int &i){while(*s)i+=*s++==46;}

von bastelwastl (Gast)


Lesenswert?

und nochmal kürzer
1
int i;f(char *s){while(*s)i+=*s++==46;return i;}

von bastelwastl (Gast)


Lesenswert?

Ok, ich gebe mich geschlagen. Verflixt!

von Random .. (thorstendb) Benutzerseite


Lesenswert?

bastelwastl schrieb:
> und nochmal kürzer
1
int i;f(char *s){while(*s)i+=*s++==46;return i;}

ne :-)
1
void f(char*s,int&i){while(*s,i+=*s++==46);}

von bastelwastl (Gast)


Lesenswert?

Random ... schrieb:
> Mal schauen, ob am Ende des Tages noch was von der Zeile übrig ist :-)
>
1
> void f(char *s, int &i){while(*s)i+=*s++==46;}
2
>
1
main.c|8|error: syntax error before '&' token|

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Gerade mit MS VC 2010 compiliert:
1
void f(char*s,int&i){while(*s,i+=*s++==46);}

Müsste eig. egal sein, weil man ja 'int& i' sowie 'int &i' schreiben 
kann.

von bastelwastl (Gast)


Lesenswert?

Bei mir war es der GCC. Aber was bedeutet das '&' bei int, ist das in 
diesem Kontext gleichbedeutend mit '*'?

von Random .. (thorstendb) Benutzerseite


Lesenswert?

bastelwastl schrieb:
> Bei mir war es der GCC. Aber was bedeutet das '&' bei int, ist das in
> diesem Kontext gleichbedeutend mit '*'?

Nicht ganz:
&i ist soviel wie:
1
void fkt(*i){
2
  *i++;
3
}
mit kürzerer Schreibweise. Man muss aber genau aufpassen, wenn man sowas 
verwendet :-)

Warscheinlich musst du es als cpp compilieren.

von bastelwastl (Gast)


Lesenswert?

Oh Ha...

> Warscheinlich musst du es als cpp compilieren.
Das erklärt einiges.

von Thomas (Gast)


Lesenswert?

Hier mal ein standard weg:
1
    std::string s("test.test.test.");
2
    int i = std::count(s.begin(), s.end(), '.');

von Thomas (Gast)


Lesenswert?

Ich bin im uebrigen nicht der Thomas der den Thread initial gestartet 
hat.

von Karl H. (kbuchegg)


Lesenswert?

Εrnst B✶ schrieb:
> Und, hat jemand eine "echte" C++ Lösung? mit
>
> #include <algorithm>
> #include <functional>
>
> und
>
> std::count_if
> std::equal_to


Du hast es ja praktisch schon vorgeben
1
#include <iostream>
2
#include <string>
3
#include <functional>
4
#include <algorithm>
5
6
int fkt( std::string test )
7
{
8
  return count_if( test.begin(), test.end(), std::bind2nd(std::equal_to<char>(), '.'));
9
}
10
11
int main()
12
{
13
  std::cout << fkt( "Hallo.World." ) << std::endl;
14
}

Hab mir gerade eine 'pessimistische' Lösung überlegt:
Rekursiv alle möglichen Sätze innerhalb von 7-Bit ASCII zusammenbauen.
Dabei darauf achten, wieviele Punkte generiert wurden. Hat man auf die 
Art einen Satz gebaut, der dem Ausgangssatz entspricht, weiß man 
wieviele '.' da drinnen sind.

von Klaus W. (mfgkw)


Lesenswert?

Das wird als "Sieb des Karl-Heinz" in die Geschichte eingehen :-)

von Random .. (thorstendb) Benutzerseite


Lesenswert?

warum einfach, wenn es auch kompliziert geht :-)

> std::equal_to<char>()
oha, STL?

von Sam .. (sam1994)


Lesenswert?

1
#define f(s,i) for(;*s;i+=*s++==46)

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.